2009-03-26 5 views
0

は、私はすべての電子メールアドレスが変更されますRegexのグループ化を制御するにはどうすればよいですか?

Lines.Strings = (
    '[email protected]' 
    '[email protected]' 
    '[email protected]' 
    '[email protected]') 

それに次のコードの断片を含むテキストファイルを持っています。 Lines.LineのLines部分と同様に、EG Test.Strings、ListBox.Stringsとも呼ばれます。

このStrings =()ブロック内のすべてのテキストと一致するようにしたい。ここ

は私が

[a-zA-Z]+\.Strings\s+=\s+[\(]{1}(.+)[\)]{1} 

を使用しているコードですが、これは私がグループ化が最初の後に停止したい試合のすべて

をキャッチしていない)発見されました。それは最初の(そして最後までのファイルの最後までの)すべての文字に一致するように見えます。

助けを歓迎します。

EDIT

私は、 "電子メール" を一致させるために求めていませんよ。私はオープニング(とクローズ)の間に任意のテキストが欲しい

私はそれが "貪欲でない"マッチングと呼ばれると思います。最初の試合の後に試合が終わって欲しい)だけが見つかります。

+0

電子メールアドレスの検証は厳しい正規表現の問題です。ここでいくつかのオプションのパフォーマンスの素晴らしい議論です:http://fightingforalostcause.net/misc/2006/compare-email-regex.php – bernie

+0

私の質問を調整しました。ありがとう –

+0

謝罪、私は誤解、私の答えを削除しました。 –

答えて

3

これはうまくいく場合があります。

[a-zA-Z]+\.Strings\s*=\s*\(([^)])+)\) 

また、どのように改行を扱っていますか?それはあなたの問題かもしれません。あなたが与えた正規表現から、すべての行をスペースで連結しているかのように見えます。そうでない場合は、複数行の正規表現について考える必要があります。あなた自身の質問への答えを受けて

"[a-zA-Z]+\\.Strings\\s+=\\s+[\\(]{1}(.+?)\\){1}?", 

は不雑然とあり、そしてあなたは、いくつかのケースのための期待どおりに動作しない場合があります。

    あなたはそれがデフォルト
  • [\)]だから{1}を記述する必要はありません
  • は、あなたもそのようにかかわらず、=は、スペースで囲まれていない場合には一致しませんだけで\)
  • と同じです空白は一般的に任意です
  • 最終的にを選択して除外しないでください。内部パターンから)を除外することは、それがあなたのキャプチャに含まれることを意味します。私が投稿だけで何ですが、バックスラッシュを文字列で使用するために倍増

    "[a-zA-Z]+\\.Strings\\s*=\\s*\\(([^)]+)\\)" 
    

    :これらのリード線の修復

+0

私は "SingleLine" RegexOption –

+0

を使用します。次に、あなたの例のような複数行の場合にマッチするように、すべての行を1つの長い行(それらの間にスペースを入れて)に接着する必要があります。 – MarkusQ

+0

助けてくれてありがとう! +1して受け入れる –

1

は、私はそれを得ているように見える

/\(([^\)]+)\)/ 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    \(      '(' 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    [^\)]+?     any character except: '\)' (1 or more 
          times (matching the least amount 
          possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    \)      ')' 
---------------------------------------------------------------------- 
0
public static Regex regex = new Regex(
     "[a-zA-Z]+\\.Strings\\s+=\\s+[\\(]{1}(.+?)\\){1}?", 
    RegexOptions.IgnoreCase 
    | RegexOptions.Singleline 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

を試してみてください。

これを改善できる場合は、更新されたバージョンであなた自身の答えを投稿してください。

注 - 上記は機能します。

+0

あなたはそれを手に入れましたが、あなたは多くの不必要なことをしています。詳細は私の答えを見てください。 – MarkusQ

関連する問題