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

Tamil language full-word search with .NET Regex

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

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

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

举个例子: 对于 "\bஅம்மா\b" 模式正则表达式在 அம்மாவிடம்和அம்மாக்கள்记录但不在原始அம்மா记录中。

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

由于\b只匹配start/end的string和word char或word和non-word char,在char和non-word char之后不会匹配.

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

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

参见this regex demo

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

或者,如果您想避免在基数 letters/diacritics 内进行匹配,请使用

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

this regex demo

(?<![\p{L}\p{M}])(?![\p{L}\p{M}]) lookarounds 的工作原理与上面的类似,只是如果搜索短语的两边有字母或组合标记,它们将无法匹配。