web-dev-qa-db-ja.com

Java-特に正規表現の場合

Java(エスケープシーケンスなし)で生の文字列を使用する方法はありますか?

(私はかなりの量の正規表現コードを書いており、生の文字列は私のコードを非常に読みやすくします)

私は、言語がこれを直接提供しないことを理解していますが、何らかの方法でそれらを「シミュレート」する方法はありますか?

68
PlagueHammer

いいえ、ありません。

一般的に、生の文字列と正規表現をプロパティファイルに入れますが、これらにはエスケープシーケンスの要件もいくつかあります。

37
stevedbrown

これは、Eclipseを使用している場合の回避策です。文字列リテラルにテキストを貼り付けると、長いテキストブロックが正しく複数行になり、特殊文字が自動的にエスケープされます

「-paste here-」;

window→preferences→Java→Editor→Typing→「文字列リテラルへの貼り付け時にテキストをエスケープする」でそのオプションを有効にした場合

47
Dread

いいえ(悲しいことに)。

11
jsight

クラスパスに生のテキストファイルを用意し、getResourceAsStream(....)で読み込みます

プロパティファイル は一般的ですが、乱雑です-ほとんどの正規表現をコードとして扱い、参照できる場所に保管します。実際の質問については:)

はい、読みにくいという問題を回避する方法があります。あなたが試すかもしれません:

String s = "crazy escaped garbage"; //readable version//

ただし、更新時には注意が必要です。 Eclipseには、引用符の間にテキストを貼り付けるオプションがあり、エスケープシーケンスが適用されます。戦術は、最初に読み取り可能なバージョンを編集してからゴミを削除し、空の引用符「」の間に貼り付けることです。


アイデアの時間:

エディターをハックして変換します。プラグインとしてリリース。プラグインを調べましたが、何も見つかりませんでした(検索してみてください)。エスケープされたソース文字列とテキストボックステキストの間には1対1の対応があります(\ n、\ r\nは割引)。おそらく、両端に2つの引用符が付いた強調表示されたテキストを使用できます。

String s = "##########
#####";

ここで、#は強調表示されている任意の文字です-改行は改行として扱われます。強調表示された領域内で入力または貼り付けられたテキストは、「実際の」ソースでエスケープされ、あたかもそうでないかのように表示されます。 (Eclipseが貼り付けられたテキストをエスケープするのと同じ方法で、これは入力されたテキストをエスケープし、バックスラッシュなしで表示します。)通常編集する場合は、引用符の1つを削除して構文エラーを引き起こします。うーん。

3
mk.

注:本日現在、利用できません。機能がリリースされるたびに、おそらくこの回答をもう一度編集します。

JavaにRaw文字列を導入するための継続的な提案があります 。実際、正規表現の場合に非常に役立ちます。

例1:としてコーディングされた正規表現文字列

  System.out.println("this".matches("\\w\\w\\w\\w"));

代わりに

System.out.println("this".matches(`\w\w\w\w`));

バックスラッシュは特別な意味を持つと解釈されないためです。

例2:外国語が付加された複数行の文字列リテラル。

A multiple line string that was coded as 
    String html = "<html>\n" +
                "    <body>\n" +
                "         <p>Hello World.</p>\n" +
                "    </body>\n" +
                "</html>\n";

代わりに

 String html = `<html>
                       <body>
                           <p>Hello World.</p>
                       </body>
                   </html>
                  `;

中間引用符、連結、および明示的な改行の必要性を回避します。

近いうちにリリースされることを期待できます。

3
Suresh Atta

String#getBytes() は、16ビットUTF-16エンコード文字列を実際に含むすべての単一Stringオブジェクトに含まれる内部バイト配列のコピーを公開します-バイト配列には、一致するように変換された同じ文字列が含まれますプラットフォームのデフォルトの文字セット。私が言っているのは、これはJavaで得られる「生の」文字列に近いと思うということです。

2
Esko

いいえ。しかし、これを簡単に処理できるIntelliJプラグインがあります。これは String Manipulation と呼ばれます。

IntelliJは、貼り付けられた文字列も自動的にエスケープします。 (@Dread points out のように、Eclipseにはこれを可能にするプラグインがあります。)

0
Michael Scheper

独自のエスケープされていないプロパティリーダーを記述し、リソースファイルに文字列を入れることができます。

0
ShabbyDoo

私は個人的にコードではなく正規表現文字列データを検討しているので、コードではそれらが好きではありませんが、それは非現実的で人気がないことを理解しています(はい、私はそれを理解します、あなたは私に怒鳴る必要はありません)。

これを行うネイティブな方法がないため、2つの可能性を考え出すことができます(3つですが、3つ目は、うーん、不自然です)。

したがって、私の個人的な好みは、ファイルを文字列に解析することです。ファイル内の各エントリに名前を付けて、それらをすべてハッシュテーブルにロードして、コードから簡単にアクセスできます。

2番目の選択肢は、Javaインターフェイスに事前処理されるファイルを作成します。そうすると、正規表現をエスケープできます。個人的にコード生成が嫌いですが、Javaファイルは100%人が編集することはありませんが、それほど悪くはありません(本当の悪は、編集が予想されるファイルを生成することです!)

3つ目(巧妙で、おそらく悪いアイデア):コンパイル時にテキストファイルまたはヘッダーファイルにコメントから文字列を抽出するカスタムドックレットを作成し、上記の他の2つの方法のいずれかを使用できる場合があります。これにより、文字列は使用されている同じファイルに保持されます。これを正しく行うのは本当に難しく、失敗のペナルティは極端なので、圧倒的な必要性とかなり印象的な才能がない限り、それを考慮することさえしません。

コメントは自由形式であり、「pre」タグ内のものはフォーマッタやその他のシステムのいからかなり安全なので、これをお勧めします。ドックレットは、javadocsを印刷する前にこれを抽出でき、正規表現文字列の使用を示す生成されたjavadocの一部を追加することもできます。

これを馬鹿にしてアイデアを伝える前に、これは馬鹿げたアイデアです-私は知っています、それは面白いから提案したいと思っただけですが、上で述べた私の好みは単純なテキストファイルです...

0
Bill K