2012-04-25 11 views
1

正規表現を使用してテンプレートフォーマットを解析しようとしています。複数の正規表現グループが一致する

ここではサンプル

Type of Change:     Modify 
Metavance:      None 
AutoSys :      None 
Informatica Migration:   None 
FTP Details:     None 
Device/Server:     DWEIHPRD 
DB Objects:      Delete 
           ARC_MEDICAL_CLAIM_DETAIL_FK1 
DB Name:      DWEIHPRD 
Schema-Table(s):   UTIL 
Interface(s):      IF0515 
Reports (RAPS):    None 
Ancillary Systems:   None 

は基本的にすべてが

フィールドです:データ(おそらく複数行、DBに上記の例をオブジェクトとして)

^(.+?):(.*) 

は何をやってにかなり近いですDBオブジェクトの最初の行だけを取得することを除いて、私は欲しいです。私がdotallをオンにすると、すべてが欲張りになり、すべてが「最初のフィールド」の結果になります。

フィールドとデータの両方の空白を最適に追加することはできますが、正規表現の一部として実行されない場合はそれほど大きな問題にはなりません。これは醜いソリューションです:よりよい現代的な正規表現の機能のそのおそらくいくつかが使用できない場合がありますので、わざわざ追加、私は、アクセス97 VBScriptでこの仕事をするために持っています:(

+0

あなたは正規表現を使用する必要がありますか? – ant

+0

番号。 vbscriptソリューションで実装するのが簡単な他のものがあれば、それは問題ありません。 –

答えて

0

として

@anubhavaが示唆しているように、正規表現以外の解決策があるかもしれません。私はちょうどそれが何であるかを言うのに十分よく分かりません。

この通りarticle VBScript for Microsoft Office先読み、lookbehindsと非キャプチャ(2009年の記事の日付)をサポートしていますが、もしAccess 97までサポートが戻ってきたら私はかなり驚くでしょう - dが間違っている。

通常、私は先​​読みと非キャプチャグループを使用しますが、Office 97ではサポートされない可能性があるため、避けています。キャプチャグループ3は無視してください複数行のマッチでオプションの行末の文字をテストする)。これは、2行にまたがる一致のみを見つけることに注意してください。

^(.+):\s+(.+)(\r\n\s+(.+))* 
note this has four capture groups, but you will ignore \3. Use \1, \2, and \4 (four will be empty for single line matches) 

を説明:

^   # beginning of line 
(.+):  # capture one or more characters up to a colon 
\s+(.+) # skip past whitespace, then capture characters up to end of line 
(  # open a capturing group (to be thrown away. See explanation above) 
    \r\n\s+ # peek ahead to see if there are EOL characters followed by whitespace 
    (.+) # if we got this far, capture whatever characters come after the whitespace 
)*  # and make this group optional (and you will ignore it anyway)