Groovy Regex:角色类中的代字号有什么作用?

时间:2012-07-12 14:57:19

标签: java regex groovy tilde character-class

我的这个正则表达式来自一个时髦的代码:

(?:[^\p{Alnum}äöü**~D~V~\~_**]|^)

(?:sometext|s\.t\.)

(?:[^\p{Alnum}äöü**~D~V~\~_**]|$$)

我唯一不理解的是这部分:

**~D~V~\~_**

波士顿在那做什么?这是一个错误吗?或者只是字符类的一些开关?

我的理解是第一行和第三行匹配单词边界,而第二行匹配有问题的文本(长短形式)。

我尝试使用谷歌搜索(当然在这里搜索),但不幸的是,瓷砖属于groovy中的“匹配此”运算符,所以我在这里找到了关于如何正则表达式的一般信息。

1 个答案:

答案 0 :(得分:2)

在groovy或Java正则表达式中,代字号没有任何特殊含义。 Groovy根本不会改变正则表达式的Java解释。所有特殊字符都列在java.util.regex.Pattern的API参考页上。

如果删除\p{Alnum}字符类和转义的代字号,您可以更轻松地看到~未被特别处理:

assert ("D" ==~ "(?:[^äöü~D~V~_])") == false
assert ("V" ==~ "(?:[^äöü~D~V~_])") == false
assert ("~" ==~ "(?:[^äöü~D~V~_])") == false
assert (" " ==~ "(?:[^äöü~D~V~_])") == true

我扔掉了这些正则表达式。他们显然是错误的,并且使用额外的字符进行混淆。 Word边界可以与\b匹配,\p{Alnum}äöü几乎肯定是\p{Alphabetic}\p{Digit}来正确处理unicode。