web-dev-qa-db-ja.com

正規表現文字列に部分文字列が含まれていません

部分文字列を含まない文字列を照合しようとしています

私の文字列は常に「http://www.domain.com/」で始まります

一致から除外したい部分文字列は、文字列(ドメイン名のフォルダー名)の後に続く「.a /」です。

除外したい部分文字列の後の文字列に文字が含まれます

例えば:

「http://www.domain.com/.a/test.jpg」は一致しないでください

ただし、「http://www.domain.com/test.jpg」は

13
Joe Smalley

負の先読みアサーションを次のように使用します。

^http://www\.domain\.com/(?!\.a/).*$

Rubular Link

パーツ(?!\.a/).a/以外のものと一致します

26
codaddict

そのような場合の私のアドバイスは、ネガティブな先読みアサーションなどで過度に複雑な正規表現を作成しないことです。
シンプルでバカにしてください!
2つの一致を実行します。1つはポジティブ用で、後でネガティブを分類します(またはその逆)。ほとんどの場合、簡単ではないにしても、正規表現は簡単になります。そして、あなたのプログラムはより明確になります。
たとえば、foobarではなくfooですべての行を抽出するには、次を使用します。

grep foo | grep -v foobar
7
Ingo

先読みを使用せず、単純な正規表現を使用する場合は、ドメインと一致するが.a/と一致しないと言うことができます。

<?php

function foo($s) {

    $regexDomain = '{^http://www.domain.com/}';
    $regexDomainBadPath = '{^http://www.domain.com/\.a/}';

    return preg_match($regexDomain, $s) && !preg_match($regexDomainBadPath, $s);
}

var_dump(foo('http://www.domain.com/'));
var_dump(foo('http://www.otherdomain.com/'));

var_dump(foo('http://www.domain.com/hello'));
var_dump(foo('http://www.domain.com/hello.html'));
var_dump(foo('http://www.domain.com/.a'));
var_dump(foo('http://www.domain.com/.a/hello'));
var_dump(foo('http://www.domain.com/.b/hello'));
var_dump(foo('http://www.domain.com/da/hello'));

?>

http://www.domain.com/.a/で終わらないため、テストに合格することに注意してください。

0
nonopolarity

私は

^http:\/\/www\.domain\.com\/([^.]|\.[^a]).*$

ドメインに加えて、で継続しないすべてのものを一致させたい。そして、それが続くすべては。ただし、aではありません。 (最終的には/必要に応じて後で追加できます)

0
M'vy