使用 .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)";
这里,如果searchText
之前有一个单词char,(?<!\w)
匹配失败,如果要查找的文本后面有一个单词char,(?!\w)
匹配失败。请注意,如果文本可以包含特殊的正则表达式字符,您也可以使用 Regex.Escape(searchText)
。
或者,如果您想避免在基数 letters/diacritics 内进行匹配,请使用
var pattern = $@"(?<![\p{{L}}\p{{M}}]){searchText}(?![\p{{L}}\p{{M}}])";
(?<![\p{L}\p{M}])
和 (?![\p{L}\p{M}])
lookarounds 的工作原理与上面的类似,只是如果搜索短语的两边有字母或组合标记,它们将无法匹配。
我有一个充满泰米尔语单词和搜索字符串的网格。我需要通过网格记录实现全词搜索。我正在使用 .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)";
这里,如果searchText
之前有一个单词char,(?<!\w)
匹配失败,如果要查找的文本后面有一个单词char,(?!\w)
匹配失败。请注意,如果文本可以包含特殊的正则表达式字符,您也可以使用 Regex.Escape(searchText)
。
或者,如果您想避免在基数 letters/diacritics 内进行匹配,请使用
var pattern = $@"(?<![\p{{L}}\p{{M}}]){searchText}(?![\p{{L}}\p{{M}}])";
(?<![\p{L}\p{M}])
和 (?![\p{L}\p{M}])
lookarounds 的工作原理与上面的类似,只是如果搜索短语的两边有字母或组合标记,它们将无法匹配。