正则表达式字断Unicode的变音符号
-
19-09-2019 - |
题
我的工作,使用基于来自用户的输入的正则表达式搜索文本的应用程序。用户具有一个选项是包括使用一个星号“匹配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
)基本上是一个双环视。一看后面,确保早于当前位置的字符的类型。同样一个向前看。
在第二正则表达式,我删除查找变通和使用简单的字符类来代替。
不隶属于 StackOverflow