ある単語を含み、別の単語を含まない文字列の正規表現


103

私はGoogleアナリティクスでいくつかの目標を設定しており、少し正規表現のヘルプを使用できます。

4つのURLがあるとします

http://www.anydotcom.com/test/search.cfm?metric=blah&selector=size&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah2&selector=style&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah3&selector=size&value=1
http://www.anydotcom.com/test/details.cfm?metric=blah&selector=size&value=1

文字列selector = sizeを含み、details.cfmを含まないすべてのURLを識別する式を作成します

別の文字列を含まない文字列を見つけるには、次の式を使用できます。

(^((?!details.cfm).)*$)

しかし、selector = size部分に追加する方法がわかりません。

どんな助けでも大歓迎です!

回答:


144

これはそれを行うはずです:

^(?!.*details\.cfm).*selector=size.*$

^.*selector=size.*$十分に明確でなければなりません。最初のビット(?!.*details.cfm)は否定的な先読みです。文字列を照合する前に、文字列に「details.cfm」が含まれていないことを確認します(その前に任意の数の文字が含まれています)。


8
参考までに、regexr.comでこれらの式をテストするための優れた方法を確認してください。
Joshua Pinter

ネガティブルックアヘッドは常に忘れてください。これはとても便利です
Alexei Blue

"http://www.anydotcom.com/test/search.cfm?metric=blah&selector=sized&value=1" =~ /^(?!.*details\.cfm).*selector=size.*$/ #=> 0間違っています。(文字列にはが含まれて"...selector=sized..."いることに注意してください。)また、なぜ.*$最後に?
Cary Swoveland

4

正規表現は次のようになります(perl構文):

`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`

これは破損した正規表現です。角括弧はすべてのパターンシーケンスを個々の文字の組み合わせに変換します。
WiktorStribiżew19年

2
^(?=.*selector=size)(?:(?!details\.cfm).)+$

正規表現エンジンがposssive量指定子をサポートしている場合(Google Analyticsはそうではないと思われますが)、これは大きな入力セットに対してより良いパフォーマンスになると思います:

^[^?]*+(?<!details\.cfm).*?selector=size.*$

これはselector=size、常にbefore details.cfmであることを前提としています。これは、最後のURLには当てはまりません。
Kobi

これを片付けるために、私ではありませんでした。なぜ誰かがここで2つの回答に反対票を投じるのかわかりません。どちらも正しいです。
Kobi

@Kobi:これは先読みであるはずでしたが、修正されました。あ、ちなみに、私はそれがあなたの反対票だとは思っていませんでした。
トマラック

0

--line-bufferedOPとKobiのソリューションがうまく機能するので、同じような状況で尾を避ける方法を探していました。私の場合、「bot」または「spider」のいずれかを含む行を除外しながら除外します' / '(ルートドキュメントの場合)。

私の元のコマンド:

tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '

今度は(-Pperlスイッチを使用)になります。

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.