2017-07-12 26 views
2

私はいくつかの質問を検索しましたが、私が探している正確な答えを見つけることができませんでした。 大文字の文字列を検索してキーワードマッチを検索するという要件があります。私はIndexOfを使用していましたが、私は完全な単語一致を見つける必要があります。私はJavaを検索するが、テキストにはJavaScriptが含まれていれば一致しないはずです。 \ b {パターン} \ bを使ってうまく動作しますが、C#のようなものを検索しても動作しません。以下はC#Regex単語全体に一致する、特殊文字

は私が探していて、テキスト文字列のいくつかの例です:

languages include Java,JavaScript,MySql,C# 
languages include Java/JavaScript/MySql/C# 
languages include Java, JavaScript, MySql, C# 

明らかに問題は特殊文字「#」です。このため、これはC++を検索するときにも機能しません。

+0

用語間の可能な区切り記号はすべてわかりますか? – GigiSan

+0

私が探しているテキストはインターネットから削られていません。これは、通常の論理ワード境界である。空白、カンマなど – percentum

+0

私はすべてのカンマとスラッシュ(そして期待している可能性のある他のセパレータ)をスペースで置き換えます。次に、重複するスペースをすべて削除し、先頭に1つ、最後に1つを追加します。次に、 '' "+ word +" "'を検索します。 – GigiSan

答えて

2
Regex.Escapeを使用してパターンを脱出し、 (?<!\w)/ (?!\w)前後参照して コンテキスト依存 \b単語の境界を交換

文字列の開始または現在の位置の直前の非単語の文字であり、(?!\w)は、文字列の終わりまたは非単語の文字が直ちに存在する場合に一致しない負のルーアヘッドです現在の場所です。

+1

これがそうするような歓声が見えます – percentum

1

これは、#の後に単語境界(\b)がないためです。#は「単語」文字ではないためです。あなたが可能な文字のすべてを一覧表示することができます信じるならば、

\b{pattern}[^a-zA-Z+#] 

または:あなたは、言語の後に言語名[^a-zA-Z+#]の一部ではない文字を検索し、次のような正規表現を使用することができます言語名の一部ではないこと(例えば、空白、,.、及び;):

[\s,.;]{pattern}[\s,.;] 

あるいはそれが言語名は、文字列の最後にあることが可能である場合、(依存あなたがデータを取得しているものについて)、セパレータに加えて文字列$、または同様に文字列^の先頭。ある場合

var rx = [email protected]"(?<!\w){Regex.Escape(pattern)}(?!\w)"; 

(?<!\w)が一致して失敗した負の後読みです:

[\s,.;]{pattern}(?:[\s,.;]|$) 
関連する問題