2009-10-02 63 views
0

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

然而,在此期间,我需要实现功能和产品出货。我正在考虑使用[\p{L}\p{M}\p{N}\p{Pc}]*作为替代文本,但坦率地说,我在“我真的不明白这将要做什么”的土地。我的意思是,我可以阅读规格说明书,但我不确定我是否可以对此进行充分测试,以确保其符合我的期望。我根本不知道要测试的所有边界条件。该应用程序由跨文化工作人员使用,其中许多人处于部落地区,因此需要支持任何和所有书写系统,其中包括一些使用零宽度单词分隔的书写系统。

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

感谢您的帮助。

回答

1

/(?:(?=\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)基本上是一个双重环视。一个看后面,确保当前位置之前的字符类型。同样,展望未来。

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