3

負の後読み正規表現に問題があります。stackoverflow の結果を読みましたが、よくわかりません。

私はゲームサーバーを運営しており、ユーザーのチャットを読み取り、禁止ワードを使用したユーザーをキックするツールを持っています。このツールは、PERL 正規表現エンジンを使用します。

私の禁止用語は、「バッグ」または「ディガー」の一般的な派生語だとしましょう。次の正規表現を使用して、これらの単語を含むチャット ラインを照合できます。

(?i)(digg|bag)(?-i)

私の実際のリストには他の単語があります。

ただし、最初に警告を提供したいと思います。これはチャットに次のように表示されます。

所有者:「ディガー」とは言わないでください

そのため、"Owner:" が前にある場合、禁止単語リストと一致しないように否定後読みを使用してみました - ただし、":" と禁止単語の間に使用する正確なテキストを指定した場合にのみ機能します言葉 - 私はいつもするわけではなく、しばしば誤って自分自身と一致します.

私は使用しようとしました:

(?<!Owner\:)/s*(?i)(digg|bag)(?-i)

空白しかない場合に機能しますが、私が本当に欲しいのは一致しないことです:

所有者:ディガー

所有者: ディガー

所有者: 侮辱としてバッグを使用しないでください

所有者:(その他はこちら)dig

などですが、次のように一致します。

(その他):(コロンの後に続くものに関係なく、禁止された単語)

ゼロ幅のアサーション (頭を包むことができない) が原因で、この構文で必要なことが可能であるかどうか、または正規表現 fu が単に弱いかどうかはわかりません。

いくつかのチュートリアルを試し、regex101 パーサーを使用しましたが、必要なものがまったく得られません。助けてください。

4

3 に答える 3

3

あなたが欲しいようです:

/^(?!Owner:).*(?i:(digg|bag))/s

Owner: で始まらず、(大文字と小文字を区別しない) digg または bag を含む一致するメッセージ。

于 2016-02-21T03:34:09.193 に答える
2

これを試すことができます(?<!Owner):[^:]*?\K(?i:digg|bag)

デモ

説明

 (?<! Owner )                  # Not 'Owner' behind colon
 : [^:]*?                      # Colon, then not Colon's up to the ..
 \K                            # Previous, not part of match
 (?i: digg | bag )             # Only the bad word will match $&

チェックが 最初 Ownerまたはその近くにある行指向であると予想される場合は、これを使用します。

キャプチャーパーツ使用。

(?mi)^(?!\h*Owner:)\h*([^:\r\n]*?):(.*?)(digg|bag)

エキスパンド

 (?mi)
 ^  
 (?! \h* Owner: )
 \h*                           # Trim whitespace
 ( [^:\r\n]*? )                # (1), User
 : 
 ( .*? )                       # (2), Before bad word
 ( digg | bag )                # (3), Bad word
于 2016-02-20T20:46:42.410 に答える
2
Owner\:\s*.*?(digg|bag)(*SKIP)(*F)|(digg|bag)

(*SKIP)(*F)そこにあるときに失敗するために使用できますOwner。デモを参照してください。

https://regex101.com/r/uE6jQ1/5

于 2016-02-20T20:52:14.750 に答える