2012-03-29 7 views
3

与えられたシーケンスのサブパターンの一致をチェックしてブロックできるようにする方法があるのだろうかと思います。正規表現のサブパターンに前のサブパターンが含まれていないことを確認しますか?

たとえば、以前のキャプチャの繰り返しを除いてすべてをキャプチャしたいとしましょう。だから私が文[word plus word]を持っていれば、次のようなものがすべての二番目の出現まで(word plus)をキャプチャするはずです。

(\w+)[^\1]+ 

最初(\w+)キャプチャword。 2番目の[^...]キャプチャグループはそれを除外しようとしますが(先にキャプチャしたのは\1です)、サブパターンキャプチャではなく文字のみで動作します。

これはどうしてですか?

答えて

9

あなたはこのようなパターンを使用することができます。

以前にマッチした単語を部分式に含まれていないこと(すべての文字で)アサートする負の先読みを使用しています
(\w+)(?:(?!\1).)* 

+0

これはそれ以上のポイントが必要です。私はこの答えをたくさん使ってきました! – Xeoncross

+0

@Xeoncross、ありがとう、嬉しかった。 'foo barfoo'では、' foo bar'が必要なときに 'foo'とマッチします:--) – Qtax

1

あなたはこのように、怠惰な数量と前後参照を使用することができます:あなたは物事を一致しないように

\b(\w+)\b.*?(?=\1) 

(\w+).*?(?=\1) 

あなたも、このような単語の境界で+ wを囲むようにしたいことこんにちは、あなたは "ll"と一致するでしょう

+0

'(\ w +)。*?(?!\ 1) 'は正しく動作しません。多分あなたは '(\ w +)。*?(?= \ 1 | $)'を意味しました。 – Qtax

関連する問題