1

私はこれに夢中になっています。とてもシンプルですが、正しい正規表現がわかりません。ブラックリストに登録された単語、つまり「ass」に一致する正規表現が必要です。

たとえば、次の文字列の場合:

<span class="bob">Blacklisted word was here</span>bass

私はその正規表現を試しました:

((?!class)ass)

これは、「クラス」ではなく「ベース」ボットの「お尻」に一致します。この正規表現は、両方の出現で「お尻」にフラグを立てます。Google で複数の否定的な先読みを確認しましたが、どれも機能しません。

注: これは CMS のためのものです。モデレーターが潜在的に不適切な言葉を簡単に見つけられるようにするためです。フィルタリングを行うためにコンピューターに頼ることはできません。

4

3 に答える 3

4

後読みが利用できる場合(IIRC、JavaScript では利用できず、これを使用しているように思われます) (PHP タグに気づきました。おそらく後読みが利用可能です)、これは非常に簡単です:

(?<!cl)(ass)

後読みなしでは、おそらく次のようなことをする必要があります。

(?:(?!cl)..|^.?)(ass)

それassは、 ではない限り任意の 2 文字の前にあるcl、またはass行頭の後の 0 または 1 文字です。

ただし、これはおそらくブラックリストを実装する最良の方法ではないことに注意してください。おそらくこれが必要です:

\bass\b

これは単語に一致しますが、それassに含まれる単語には一致しませんass(などassociation) bass

于 2012-09-19T16:26:12.330 に答える
2

ここで実際に 2 つのリストを使用しようとしているように思えます。最初のリストの単語が部分文字列として含まれています。

ここでの秘訣は、後読みを使用する場所を知ることです。

/ass(?<!class)/

言い換えれば、良い単語の否定後読みは、悪い単語のパターンの前ではなく、その後に続く必要があります。その後、正しく動作します。

それらのいくつかを連続して取得することもできます。

/ass(?<!class)(?<!pass)(?<!bass)/

ただし、これは と の両方に一致passholepassます。) さらに防弾にするために、単語境界のチェックを追加できます。

/ass(?<!\bclass\b)(?<!\bpass\b)(?<!\bbass\b)/

更新: もちろん、文字列の一部などをチェックする方が効率的です(?<!cl)(?<!b)。しかし、私のポイントは、正規表現でホワイトリストの単語全体を引き続き使用できるということでした。

繰り返しになりますが、それに応じてホワイトリストを準備するのが賢明でしょう (そのため、短いパターンをチェックする必要があります)。

于 2012-09-19T16:35:15.490 に答える
-1

これはあなたが望むものですか?(?<!class)(\w+ass)

于 2012-09-19T16:05:26.990 に答える