2

テキストに 2 回出現する英文の単語に一致する必要があります。私は試した

(^|\ )([^\ ][^\b]*\b).*\ \2\b

しかし、これはすべての行に一致するわけではありません。

4

1 に答える 1

3

正規表現にはいくつかの問題があります。たとえば、\b単語境界は文字クラスでは使用できないため[^\b]*、意図したとおりに機能しません。

あなたはおそらく次のようなものが欲しい

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

これにより、単語の最初の出現から最後までのテキスト全体が一致します。これは、実際に意図したものではない可能性があります。

別のアイデア:

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

これは、単語の最初の出現から次の出現までのテキストのみに一致します。

これらの両方のアプローチの問題は、たとえば次のようなテキストで

foo bar bar foo

正規表現は from footofooに一致し、間に重複があることをやみくもに無視しbarます。

したがって、実際に重複して発生するすべての単語を見つけたい場合は、次を使用します

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

説明:

(?s)       # Allow the dot to match newlines
\b(\w+)\b  # Match an entire word
(?=        # Assert that the following regex can be matched from here:
 .*?       #  Any number of characters
 \b\1\b    #  followed by the word that was previously captured
)          # End of lookahead
于 2012-09-22T07:49:42.047 に答える