web-dev-qa-db-ja.com

1つのWordを含むが別のWordを含まない文字列の正規表現

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の部分を追加する方法がわかりません。

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

90
Chris Stahl

これはそれを行う必要があります:

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

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

126
Kobi

正規表現(Perl構文):

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

正規表現エンジンがポーズをとる数量詞をサポートしている場合(Googleアナリティクスはサポートしていないと思われますが)、これは大きな入力セットに対してより良いパフォーマンスを発揮すると思います:

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

OPとKobiのソリューションがうまく機能するのと同様の状況で、テールでラインバッファリングを回避する方法を探していました。私の場合、「/」(ルートドキュメント用)を含めながら、「bot」または「spider」のいずれかの行を除外します。

私の元のコマンド:

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

( "-P" Perlスイッチを使用)になります:

tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'
0
roon