【问题标题】:Tamil language full-word search with .NET Regex使用 .NET Regex 进行泰米尔语全字搜索
【发布时间】:2017-12-13 09:33:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 最后一个字符是 ‎0BBE TAMIL VOWEL SIGN AA,它属于\p{M} Unicode 类(组合标记)。请改用string pattern = @"(?<!\w)" + searchText + @"(?!\w)"。或者,如果您想在基本字母/变音符号内避免匹配,string pattern = @"(?<![\p{L}\p{M}])" + searchText + @"(?![\p{L}\p{M}])"
  • 感谢您的建议,但结果是一样的,很遗憾。
  • 请提供示例字符串和预期输出。上面的正则表达式only matches அம்மா as a whole word.
  • 奇怪的是,一些在线正则表达式测试工具可能会根据模式返回良好的结果,但在应用程序本身中,这是一个持续的失败。我可能应该提到我正在使用 MVS'17 和 .NET Framework 4.6。
  • 这是C# demo的链接。

标签: c# .net regex tamil


【解决方案1】:

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

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

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

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

this regex demo

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

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

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

this regex demo

(?&lt;![\p{L}\p{M}])(?![\p{L}\p{M}]) 环顾四周的工作方式与上述类似,只是如果搜索短语的任一侧有字母或组合标记,它们将无法匹配。

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多