0

私はこのようなテキストファイルを持っています:

Start
<Not Present>

   Start
  <Word>
   End

   Start 
   <Word>
   End

   Start 
   <Antoher>
   End    

End

結果として、を含む「Start...End」ブロックのみを提供する正規表現を作成する必要があります<Word>

私はこのようなもので試しました:

(Start[\s\S]+?(<Word>.*)[\s\S]+?End)

その結果、2つのサブマッチが発生します。最初のサブマッチ:

Start
<Not Present>

   Start
  <Word>
   End

2番目のサブマッチ:

   Start 
   <Word>
   End

ご覧のとおり、2番目のものは正しいですが、最初のものは間違っています。<Word>「Start...End」ブロック内にあるサブマッチのみが必要です。

どうやってやるの?

ありがとうございました。

4

3 に答える 3

1
(?s)Start(?:(?!Start|End).)*<Word>(?:(?!End).)*End

(?!Start|End).またはの最初の文字でない限り、任意の 1 文字 (修飾子\nのおかげで を含む) に一致します。これにより、最も内側のおよび区切り文字のセットのみが一致するようになります。(?s)StartEndStartEnd

.NET正規表現フレーバーを使用していることを示しているため、改行を含む.任意の文字と一致させるために(インライン(?s)修飾子を介して)シングルラインモードで使用しました。このハックは通常、JavaScript でのみ必要です。MatchCollection[\s\S]


訂正: .NET フレームワーク のクラスについて話していると思っていSystem.Text.RegularExpressions.MatchCollectionましたが、VBScript には .NET というクラスも含まれていることがわかりましたMatchCollection。おそらく、(ActiveX または COM 経由で) 使用している VBScript フレーバーであるため、正規表現は次のようになります。

Start(?:(?!Start|End)[\S\s])*<Word>(?:(?!End)[\S\s])*End

混乱して申し訳ありません。詳細については、こちらをご覧ください

于 2012-09-11T14:24:07.893 に答える
0

2つの問題:

  1. 「欲張り」マッチを使用してい?ます。欲張りでないようにするには、を追加するだけです。Startこれがないと、aと一致し、2つのペア(最初と2番目)Endにまたがり、最初と最後の両方に配置されますStartEnd<Word>
  2. [\s\S]はすべてに一致します-ドットと同じ.です。空白だけが必要[\s]

これを試してください(冗長な外側のブラケットも削除できます):

Start(.*?<Word>.*?)End
于 2012-09-11T13:58:50.053 に答える
0

[\s\S]あまり意味がありません。\s空白に一致\Sし、正反対のことを行います-空白以外に一致します。So[\s\S]は とほとんど同じ.です。

.*また、 afterで何を達成したいのかもわかりません<Word>。の後の空白と一致します<Word>

(Start[\s]+(<Word>)[\s]+End)

私が知る限り、http://regexpal.com/のテストケースで動作します。

于 2012-09-11T14:06:27.367 に答える