2

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

string pattern = @"\b" + searchText + @"\b".

它在拉丁语中按预期工作,但对于泰米尔语,此表达式返回奇怪的结果。我已经阅读了正则表达式中的 Unicode 字符,但这对我来说似乎不太有帮助。我可能需要确定单词边界在哪里找到以及为什么。

例如:对于"\bஅம்மா\b"模式 Regex 在 அம்மாவிடம் 和 அம்மாக்கள் 记录中找到匹配项,但在原始 அம்மா 记录中没有找到匹配项。

4

1 回答 1

1

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

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

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

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

请参阅此正则表达式演示

在这里,(?<!\w)如果之前有一个单词 charsearchText(?!\w)匹配失败,如果要查找的文本后面有一个单词 char 则匹配失败。Regex.Escape(searchText) 请注意,如果文本可以包含特殊的正则表达式字符,您也可以使用。

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

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

请参阅此正则表达式演示

(?<![\p{L}\p{M}])和环顾四周的(?![\p{L}\p{M}])工作方式与上述类似,只是如果搜索短语的两侧有字母或组合标记,它们就会失败。

于 2017-12-13T09:43:24.297 回答