2012-01-21 19 views
0

私はすでにこの正規表現の一般的な(28kビュー)questionを読んでいます。しかし、それは私のためには機能しません。より良い正規表現が見つかりましたが、私はちょっとした瞬間でほとんど詰まっていません。ここで正規表現以外のすべての単語に一致する正規表現(2)

は飲み物のリストです:

whisky/gin/nuka-cola/beer/liqueur/abs-inth/tea 

とスクリプトは、すべての非ソフトドリンクを取得する必要があります。私はこのために素敵な正規表現を発見した:

/\b(?!(?:tea|nuka\-cola)\b)[\w\d\-]+\b/ 

、結果は次のとおりです。

1 : whisky 
2 : gin 
3 : -cola 
4 : beer 
5 : liqueur 
6 : abs-inth 

問題はコーラ(第三の結果)です。 \ bは ' - '文字が好きではないためです。このコーラをリストから削除するのを手伝ってください。

+0

私はたぶん '/'で分割し、文字列検索(またはあなたが結婚している場合は正規表現)を使って「茶」や「コーラ」を検索し、リスト内で一致するものを無効にするトークンの –

+0

すぐに回避するには、許可されていない飲み物に '-cola'を追加してください。 – tripleee

+0

@ tripleee、その場合は 'cola'です。 – Qtax

答えて

1

\bは、英数字と非英数字の間で一致するため、ダッシュの前後がnuka-colaに一致します。

したがって、単語境界アンカーとして\bを使用することはできませんが、自分で定義することはできます。あなたのセパレータは/であることを見て、単に「エンド・オブ・単語」アンカーとして「開始の単語」アンカー、および(?=/|$)として(?<=/|^)を使用します。もちろん

/(?<=\/|^)(?!(?:tea|nuka\-cola)(?=\/|$))[\w\d\-]+(?=\/|$)/ 

これはあなたが使用していると仮定しlookbehindアサーションをサポートするregexエンジン。残念ながら、あなたはこれがどの言語であるかを指定しませんでした。例えば、JavaScriptはlookbehindsをサポートしていません。

/(?!tea|nuka-cola)([\w-]+) 

あなたはより多くのちょうど2つを持つことを計画している場合:あなたが確認している場合

(?>[\w-]+)(?<!tea|nuka-cola) 

別の可能性は、各キーワードは、スラッシュで始まる:この正規表現はトリックを行う必要があり

+0

ありがとうございました!それは本当に役立ちます! –

1

あなたの結果に表示すべきではない飲み物は、正規表現はすぐに醜いことができます。その場合、リストのすべての単語と一致する正規表現(または単純なループ)があり、一致した単語がHashSetに存在するかどうかを確認します。一致するものが見つかった場合は、結果にその一致を含めません。

関連する問題