2017-12-13 10 views
2

私はタミール語と検索文字列でいっぱいのグリッドを持っています。私は、グリッドレコードを通してフルワード検索を実装する必要があります。私はそのアプローチに.NET Regexクラスを使用しています。それはかなりシンプルに聞こえる、私がしたことは:.NET Regexでタミル語のフルワード検索

string pattern = @"\b" + searchText + @"\b"です。

ラテン語の言語では正常に動作しますが、タミル語の場合、この式は奇妙な結果を返します。私は正規表現でUnicode文字について読んだことがありますが、それは私には非常に役に立つとは言えません。おそらく私が必要とするのは、単語の境界が見つかった場所とその理由を判断することです。一例として、

:正規表現は、元のஅம்மாレコードで でマッチを見つけஅம்மாவிடம்とஅம்மாக்கள்記録ではなく、"\bஅம்மா\b"パターンについては 。

+0

最後の文字は* 0BBE TAMIL VOWEL SIGN AA *であり、 '\ p {M}' Unicodeクラス(結合マーク)に属します。代わりに 'string pattern = @"(?<!\ w) "+ searchText + @"(?!\ w) "'を使用してください。または、文字列/発音区別記号の中にマッチするのを避けたい場合、 'string pattern = @ '(?<![!\ p {L} \ p {M}])" + searchText + L} \ p {M}]) "' –

+0

提案していただきありがとうございますが、残念ながら結果は同じです。 – Dmitry

+0

文字列の例と期待される出力を提供してください。上記の正規表現は[全体の単語として 'அம்மா'にのみマッチします(http://regexstorm.net/tester?p=%28%3f%3c!%5cw%29%e0%ae%85%e%ae%aeae %e0%af%8d%e0%ae%ee%e0%ae%be%28%3f!%5cw%29&i = Regex + found +が+ in +%22%e0%ae%85%e0%ae%ae% e0%af%8d%e0%ae%ee%e0%ae%b5%e0%ae%bf%e0%ae%9f%e0%ae%ee%e0%af%8d%22 + +%22%e0%ae%85%e0%ae%ee%e0%af%8d%e0%ae%ee%e0%ae%e%%ee%95%e0%af%8d%e0%ae% 95%e0%ae%b3%e0%af%8d%22 +レコード+ but + not + in + the +オリジナル+%22%e0%ae%85%e0%ae%ae%e0%af%8d%e0% ae%ae%e0%ae%は%22 +レコードである)。 –

答えて

1

「அம்மா」単語の最後の文字は、0BBE TAMIL母音SIGNのAAであり、それは(正規表現では、それは\p{M}に一致させることができる)を組み合わせたマークです。

\bは、文字列の開始/終了と単語charの間、または単語と単語以外の文字の間でのみ一致します。一致しないのは、charおよびnon-word charの後です。

この場合、通常の回避策を使用してください。

var pattern = [email protected]"(?<!\w){searchText}(?!\w)"; 

this regex demoを参照してください。

ここでsearchTextの前に単語charがある場合は一致しません。見つかるテキストの後に単語charがある場合は(?!\w)が一致しません。テキストに特別な正規表現の文字が含まれる場合は、Regex.Escape(searchText)を使用することもできます。

それとも、あなたは基本文字/発音区別符号の内側に、 this regex demoを参照してください

var pattern = [email protected]"(?<![\p{{L}}\p{{M}}]){searchText}(?![\p{{L}}\p{{M}}])"; 

を使用する際のマッチングを避けたい場合。

(?<![\p{L}\p{M}])(?![\p{L}\p{M}])は、上記と同様に動作します。検索フレーズの両側に文字または結合マークがあれば、一致しません。