0

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

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

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

谢谢你的帮助。

4

1 回答 1

3

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

/
(?:
  (?: (?<=[\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}]+)?/

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

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

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

于 2009-10-02T22:27:06.830 回答