2017-05-04 16 views
2

これは複製ではないことを願っています。正規表現 - 文字列内に特定の文字列が含まれていない

正規表現を使用して検索すると、文字列のどこにでも単語 'bot'が含まれてはならないと言うことができますか?

私は他の場所で否定的な先読みを使用していますが、問題は「bot」という単語がどこに表示されるのかわかりません。より長い言葉の一部でも、始まりに、終わりに、あるいはその両方に現れることもあります。私は残りの表現と一致する結果を含めるだけでなく、 'bot'も除外したい。

これは私の現在の検索式である:

2017-0[2-5] (.*) (UserInfo.aspx UID=111 80 -)=(?!10. *)+. * 

そして、私が探していた結果は、一般的に次のようになります。

2017-02-16 15:56:00 10.3.1.17 GET /UserInfo.aspx UID=111 80 - 157.85.39.17 Mozilla/5.0+(compatible;+bingbot/2.0;++http://www.bing.com/bingbot.htm) 200 0 0 390 

それはが含まれているとして、理想的には、私はこの結果が除外されるようにしたいと思います私のRegExの最初の部分とまだ一致しています。

+0

あなたの質問は不明です。あなたは全体の行を一致させ、キャプチャグループを使って部分を抽出していますか?あなたのパターンの始めに '^(?!。bot)'を追加してみてください。 'bot'部分文字列を含む全ての行に失敗します。 –

+0

あなたの正規表現はこのテキストと一致しません – Mistalis

+0

私の正規表現にスペースを追加する必要がありました。なぜなら、Chromeは角括弧とアスタリスクを無視していたので、例が正しく表示されていないことがわかります – RProcter

答えて

0

可能であれば、これを2段階のプロセスとして実装します。たとえば、これがスクリプト内にある場合は、行にbotが含まれているかどうかをテストするチェックボックスと、既存の正規表現を実行する2つ目のチェックボックスがあります。

複雑なマッチング要件を複数のテストに分割することは、しばしば良い考えです。これにより、より明確なコードが得られます。特に、以前のチェックが単純な場合は、さらに効率的になる可能性があります。

このステップを個別に中断することで、ネガティブマッチではなく、より単純なポジティブマッチを使用することもできます。

例の擬似コード:

if (!string.contains('/bot/') and string.contains('/yourpatternhere/')) 
{ 
    do stuff 
} 

あなたが単一の正規表現に制限されている場合は、単純に文字列の先頭に負の先読みを使用します。

(?!^.*bot)2017-0[2-5] (.*) (UserInfo.aspx UID=111 80 -)=(?!10. *)+. * 

(私は他の可能性のある問題は無視してください。これは正当なものではありません...)

+0

これは完全に感謝しています! – RProcter

関連する問題