我的工作,使用基于来自用户的输入的正则表达式搜索文本的应用程序。用户具有一个选项是包括使用一个星号“匹配0个或多个字符”通配符。我需要这只是单词边界之间的匹配。我第一次尝试是所有星号转换为(?:(?=\B).)*,工作正常在大多数情况下。当它失败是显然的.Net认为用变音符号和其他字符一个字断Unicode字符之间的位置。我认为这是一个错误,并已提交给微软反馈网站

在此期间,但是,我需要得到实施,产品附带的功能。我使用[\p{L}\p{M}\p{N}\p{Pc}]*作为替换文本考虑,但是,坦率地说,我在“我真的不明白这是什么会做”的土地。我的意思是,我可以读的规格,但我不相信,我可以充分测试以确保它是做什么我的期望。我根本就不知道所有的边界条件测试。该应用程序是通过跨文化的工作人员,其中许多人是在部落地区使用,所以任何和所有的书写系统需要支持,包括一些使用零宽度断字。

没有人有更好的解决方案,或可以确认/校正上述代码中,或提供一些指针?

感谢您的帮助。

有帮助吗?

解决方案

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

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

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

在第二正则表达式,我删除查找变通和使用简单的字符类来代替。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top