使用.NET Regex进行泰米尔语全字搜索

时间:2017-12-13 09:33:04

标签: c# .net regex tamil

我有一个填充泰米尔语单词和搜索字符串的网格。我需要通过Grid记录实现全字搜索。我正在使用.NET Regex类来实现这种方法。这听起来很简单,我以前做的是:

"\bஅம்மா\b"

它在拉丁语中的表现与预期相同,但对于泰米尔语,这个表达式会返回奇怪的结果。我在正则表达式中读过有关Unicode字符的内容,但这对我来说似乎没什么帮助。我可能需要的是确定找到的单词边界在哪里以及为什么。

举个例子: 对于{{1}}模式,Regex找到了匹配项 அம்மாவிடம்和அம்மாக்கள்记录但不在原始的அம்மா记录中。

1 个答案:

答案 0 :(得分:1)

"அம்மா"中的最后一个字符单词是 0BBE TAMIL VOWEL SIGN AA ,它是一个组合标记(在正则表达式中,它可以与\p{M}匹配)。

由于\b仅匹配字符串的开头/结尾与单词char或单词与非单词char之间的匹配,因此在char和非单词char之后不会匹配。< / p>

在这种情况下使用常用的解决方法。

var pattern = $@"(?<!\w){searchText}(?!\w)";

请参阅this regex demo

此处,(?<!\w)如果在searchText之前有单词char并且(?!\w)在匹配后失败,如果在要查找的文本后面有单词char,则Regex.Escape(searchText)会失败。请注意,如果文本可以包含特殊的正则表达式字符,您也可以使用var pattern = $@"(?<![\p{{L}}\p{{M}}]){searchText}(?![\p{{L}}\p{{M}}])";

或者,如果您想在基本字母/变音符号内避免匹配,请使用

(?<![\p{L}\p{M}])

请参阅this regex demo

(?![\p{L}\p{M}])和{{1}}外观与上述内容类似,只是如果搜索词组的任一侧有字母或组合标记,它们就会失败。