2009-09-04 6 views
14

私は読みやすさとメンテナンスのためにコメントする必要がある複雑な正規表現をいくつか持っています。 Javaの仕様はかなり簡潔ですが、私はこの作業に長時間苦労しました。私はようやく私のバグをキャッチし、その答えとして、それを掲載する予定ですが、私は単純な名前パーサに私は(パターンの)サブコンポーネントをコメントしたいの例として正規表現Javaの正規表現にコメントを含める

を維持する上で他のアドバイスに感謝するだろう:

String testTarget = "Waldorf T. Flywheel"; 
    String patternS = "([A-Za-z]+)\\s+([A-Z]\\.)?\\s+([A-Za-z]+)"; 
    Pattern pattern = Pattern.compile(patternS, Pattern.COMMENTS); 
    Assert.assertTrue(pattern.matcher(testTarget).matches()); 

編集:(?x)形式の例についてもお礼を申し上げます。

EDIT:@ geowa4には、埋め込まれたコメントを避けるための良い提案があります。 Sinnce javaと他の人が埋め込まれたコメントを提供しています。有用なケースは何ですか? (私は事件があると思うが、私は他人を見ることに興味があるだろう)。

EDIT:正規表現は、オプションの初期うまくをサポートしていないとなり@mikej以下に示すようとして、より良い:私が見つけ

 String patternS = "([A-Za-z]+)\\s+([A-Z]\\.\\s+)?([A-Za-z]+)"; 

それが初期

答えて

21

は、正規表現、読みやすさの改善にいくつかのより多くのアイデアをComposedRegexMartin Fowlerで記事を参照してください。要約すると、彼は複雑な正規表現を意味のある変数名を与えることができる小さな部分に分解することを提唱している。例えば

String mandatoryName = "([A-Za-z]+)"; 
String mandatoryWhiteSpace = "\\s+"; 
String optionalInitial = "([A-Z]\\.)?"; 
String pattern = mandatoryName + mandatoryWhiteSpace + optionalInitial + 
    mandatoryWhiteSpace + mandatoryName; 
+0

ありがとう - これは便利なアプローチです。また、ドメイン固有言語を使用して正規表現を生成する別のアイデアも指摘しました(http://flimflan.com/blog/ReadableRegularExpressions.aspx)。 (これは実際に私のアプリケーションでは科学データ用のコンパイルされた正規表現の複雑な組み合わせがありますが、これはこの質問の範囲外です)。 –

+1

これはきれいで清潔なソリューションです。 optionalWhiteSpaceはおそらくmandatoryWhiteSpaceでしょうか? :) – crunchdog

+0

ありがとうcrunchdog。私は私を捕まえたと思うのは、実際にOPのパターンに制限があるということです.Fred Bloggsのような中間のイニシャルなしの名前があれば、最初の名前と姓の間に2つのスペースが必要です。パターン内で\ s +。私はこれに対処しようとしていましたが、私はパターンをOPのものと同等にするための答えを編集しました。 – mikej

11

にスペースを抽出してしまうでしょう働い以下:

 String pattern2S = 
      "([A-Za-z]+)  # mandatory firstName\n" + 
      "\\s+    # mandatory whitespace\n " + 
      "([A-Z]\\.)?  # optional initial\n" + 
      "\\s+    # whitespace\n " + 
      "([A-Za-z]+)  # mandatory lastName\n"; 

重要なのは、文字列で明示的に改行文字\ n個を含めた

あなたがパターンでコメントを維持したいとあなたはプロパティからそれを読み込むために必要なファイル場合は、これを使用

String pattern2S = 
    "([A-Za-z]+)" + // mandatory firstName 
    "\\s+" +  // mandatory whitespace 
    ...; 

CONTINUATION:あなたはちょうどこれをしないのはなぜ0

15

pattern=\ 
#comment1\\n\ 
(A-z)\ 
#comment2\\n\ 
(0-9) 
+0

良い提案。これは多くの単純なケースで機能しますが、正規表現を使用するコード(たとえば外部データファイル)とは独立したものにします。インラインコメントは引き続き表示されます。 –