単語/文字列を除外する正規表現


298

次のような正規表現があります。

^/[a-z0-9]+$

これは、次のような文字列にマッチします/hello/hello123

ただし、/ignoremeやなどの文字列値をいくつか除外したいと思います/ignoreme2

私はいくつかのバリアントを試しましたが、どれも動作しないようです!

私の最近の微弱な試みは

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

助けていただければ幸いです:-)


回答:


376

次に、別の方法を示します否定的な先読みを使用)。

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

注:キャプチャ式は1つだけです([a-z0-9]+)


1
素晴らしい、それはトリックをしたようです。私は実際にURLの書き換えにこのルールが必要であり、「イメージ」、「css」、および「js」フォルダーを無視したいと思いました。だから私のルールは次のようになります:^ /(?! css | js | images)([az] +)/?(\?(。+))?$そしてそれは/Profile.aspx?id=$1&$3に書き換えられますこのルールは正しく機能し、クエリ文字列も伝播しますか?したがって、誰かがmydomain.com/hello?abc=123アクセスした場合、mydomain.com / Profile.aspxid = helloabc = 123に書き換えたいのですが、(。+)のパフォーマンスについても少しわかりません元のリクエストでクエリ文字列をキャプチャする最後。
romiem

このような音は別の質問です。あなたが持っている正規表現はクエリ文字列をキャプチャするように見えます-テストして、クエリ文字列がやって来るかどうかを確認してください。また- (\?(.+))?$高速でなければなりません。速度についてはあまり気にしません。
Seth

1
これは私にはうまくいきませんでしたが、Alix Axelのソリューションはうまくいきました。私はJavaのjava.util.regex.Patternクラスを使用しています。
マークジェロニムス

1
MarkのreMarkを確認します;)-たとえば、PycharmはJavaベースですよね。したがって、Pycharm検索での正規表現を考慮すると、Alixのソリューションは機能しますが、他は機能しません。
ファニー

43

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

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

無視する単語は好きなだけ追加できます。簡単なPHP実装を次に示します。

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

後読みには固定幅のパターンが必要だと思いましたか?
サイモン2013

2
@AlixAxelできますが、よりスマートな正規表現ライブラリでは、各代替が固定長である限り、代替の長さを変えて(そして最も長いものを使用して)変更を許可します。
ChrisF 14

これは賢い方法ですが、無視された単語が他の単語の最後にある場合は失敗します。つまり、無視された単語から「a」を1つ追加すると、aで終わる単語はすべて無視されます
singmotor

21

両方の単語を除外したいので、コンジュクションが必要です:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

一致するには、両方の条件がtrueでなければなりません(ignoremeignoreme2も許可されていません)。


1
これは、一連の選択肢の否定的な先読みである上記の短い方と同等です。
ChrisF、2014

4
@ChrisFいいえ、そうではありません。Sethの解は/ignoremenot、の/後に続くようなものとは一致しませんignoreme
ガンボ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.