2009-03-23 6 views
1

私はC#の正規表現を理解していると思っていましたが、明らかにそうではありません。 START | BEGINから〜までのすべてを見つける式を考案するための助けが必要です)。式は複数行にすることができます。正規表現を使ってこれを見つけるには?

Ex。

START(FTP_STATE, XXX(
    VAL(FTP_INITIAL_STATE, 0) 
    VAL(FTP_INBOUND,  1) 
    AL(FTP_OUTBOUND,  2) 
)) 

/**************************************************************/ 

BEGIN(FTP_TIMER_MODE, YYY(
    VAL(FTP_REMOVE_TIMER,  0) 
    VAL(FTP_NOT_REMOVE_TIMER, 1) 
)) 

/**************************************************************/ 

任意の助けを大幅にそれが単純である

+0

正規表現での作業にRegexBuddyを使用することをお勧めします。 – Alekc

答えて

4

はこれを試してみてください

  • (?:START|BEGIN)STARTまたはBEGINのいずれかでスタート。その後
  • (?:[^)]+|\)[^)])+いずれか)[^)]+)以外の任意の文字または)\)[^)])以外の任意の文字が続く)が続いてもよいです。 (したがって、))とこの式を一致させる方法はありません)。
  • \)\)最後に))です。

これはバックトラックを減らすことを望みます。

10

を理解しました。 STARTまたはBEGINの後に任意の数の任意の記号が表示されますが、欲張りではなく最後の2つの閉じ括弧が付きます。 。*?任意の数の任意の記号を取りますが、できるだけ少なくします。もっとして1本のライン上の単一ラインオプションを一致させるために(?s)は有効にする必要があります(感謝アランM.ことを指摘するために。)

(?s)(START|BEGIN).*?\)\) 
+0

ニースの説明 –

0

を私はC#の構文を知らないが、Perlではそれはです:

m/(BEGIN|START).*?\)\)/s 

sは複数行になります。

あなたはちょうどあなたが理解し、学ぶためにしたくない場合はC#の

+0

最後まで一致します)))最初のファイルではなく) )BEGINまたはSTARTの後に – Tmdean

0

で正規表現複数行を作る方法を参照してくださいする必要があり、その後、私は解決策は、おそらくのようなものであるregexp site

これをお勧めしてみましょう正規表現それを説明するには

(?:START|BEGIN)(?:[^)]+|\)[^)])+\)\) 

:/(START|BEGIN).*))/

1

実際にはVAL(...)も考慮する必要があります。Perlで

それは次のようになります。

(BEGIN|START)\([^(\)\)\))].+\)\)\) 
  1. 開始 BEGINまたは
  2. は何か)))の間に、マッチング貪欲避けるために、NOTできますオープニングブラケットを持ってSTART
  3. 3つの閉じ括弧で終わる)))
+0

終了 "))"が常にそれだけで行。とにかく、あなたの正規表現は動作しません。あなたが文字クラスを否定的な先読みのように使用しようとしているようです。 –

+0

良い呼び出し - この正規表現は与えられたテキストにマッチしますが、少なくともpreg_を使った簡単なPHPテストでは、文字クラスは何もしません。 –

0
ResultString = Regex.Match(subject, @"(START|BEGIN).*?\)\)", RegexOptions.Singleline).Value; 
+0

私はそれがMultiLineでなければならないと思いますか? –

+0

私はおそらくあなたが正しく、RegexBuddyからの自動生成されたコードです。なぜならPHPで作業しているからです(正規表現は正しいですが:D) – Alekc

0

他のいくつかは、 "複数行モード" を呼び出している何本

MatchCollection m = Regex.Matches(input, "(START|BEGIN).+?\\)\\)", RegexOptions.Multiline); 
1
@"(?s)(?:START|BEGIN).*?\)\)" 

を試してみて、実際にシングルライン(またはDOTALL)モードです。それはドットが改行にマッチするモードです。マルチラインモードでは、 '$'は行の先頭に一致します。 '$'は行の終わりに一致します(通常、文字列全体の開始と終了のみ一致します。 ) "。

+0

マルチライン/シングルラインのものを指してくれてありがとう。オプションの名前はよく選択されています。同時にシングルラインとマルチラインモードを有効にすることができます...:D –

1

あなたはすでにあなたの答えを得ましたが、私はthis linkを投げたいと思っていました。これは、式の作成/テストに非常に役立ちます。

関連する問題