我的网格充满了泰米尔语单词和一个搜索字符串。我需要通过网格记录实现全词搜索。我正在使用.NET REGEX类作为该方法。听起来很简单,我以前做的是:
字符串模式= @" b" searchText @" b"
。
它在拉丁语中按预期工作,但对于泰米尔语来说,此表达式返回了奇怪的结果。我已经阅读了正式表达式中的Unicode角色,但这对我似乎并没有什么帮助。我可能需要的是确定在哪里找到边界和原因。
例如:对于"bஅம்மாb"
模式,以下是在அம்மாவிடம்和அம்மாக்கள்记录,但没有在原始அம்மா记录中。
"அம்மா"字中的最后一个字符是 0bbe泰米尔元音符号AA ,它是一个组合标记(在Regex中,可以与p{M}
匹配)。
作为 b
仅在字符串的启动/结尾和单词char之间或单词和非字char之间匹配,它在char和非字char之后不匹配。
在这种情况下,使用通常的解决方法。
var pattern = $@"(?<!w){searchText}(?!w)";
请参阅此正则演示。
在这里,如果在searchText
之前有一个字char,并且(?!w)
在文本后有一个字char,则(?<!w)
将使匹配失败。注意,如果文本可以包含特殊的正则chars。
Regex.Escape(searchText)
。或,如果您想避免在基本字母/变音符号内时匹配,请使用
var pattern = $@"(?<![p{{L}}p{{M}}]){searchText}(?![p{{L}}p{{M}}])";
请参阅此正则演示。
(?<![p{L}p{M}])
和 (?![p{L}p{M}])
loughounds的工作方式与上面的工作类似,只是在搜索短语的两侧有字母或组合标记时,它们会失败。