【问题标题】:Regex word-break with unicode diacritics带有 unicode 变音符号的正则表达式分词
【发布时间】:2009-10-02 20:51:35
【问题描述】:

我正在开发一个基于用户输入使用正则表达式搜索文本的应用程序。用户的一种选择是使用星号包含“匹配 0 个或更多字符”通配符。我只需要在单词边界之间匹配。我的第一次尝试是将所有星号转换为(?:(?=\B).)*,这在大多数情况下都可以正常工作。它失败的地方显然是.Net认为带有变音符号的unicode字符和另一个字符之间的位置是断词。我认为这是一个错误,并已将其提交给Microsoft feedback site

不过,与此同时,我需要实现功能并交付产品。我正在考虑使用[\p{L}\p{M}\p{N}\p{Pc}]* 作为替换文本,但坦率地说,我处于“我不太明白这将要做什么”的地步。我的意思是,我可以阅读规范,但我不相信我可以充分测试它以确保它符合我的预期。我根本不知道要测试的所有边界条件。该应用程序由跨文化工作者使用,其中许多人在部落地区,因此需要支持任何和所有书写系统,包括一些使用零宽度分词的系统。

有没有人有更优雅的解决方案,或者可以确认/更正上面的代码,或者提供一些指针?

感谢您的帮助。

【问题讨论】:

    标签: regex unicode word-boundary


    【解决方案1】:

    在 unicode 上下文中,/(?:(?=\B).)*/ 的等价物是:

    /
    (?:
      (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}])
      |   (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}])
      )
      .
    )*
    /
    

    ...或有些简化:

    /(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/
    

    这将匹配一个单词或一个非单词(空格、标点符号等)序列,可能是一个空序列。

    正常或否定的词边界(\b\B)基本上是双重环视。一个向后看,确定当前位置之前的字符类型。同样是向前看。

    在第二个正则表达式中,我删除了环视并使用了简单的字符类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-27
      • 2017-02-03
      • 2013-04-02
      • 2011-08-13
      • 2011-08-29
      • 2010-12-20
      • 2012-03-05
      相关资源
      最近更新 更多