【问题标题】:Groovy Regex: What does a tilde in a character class do?Groovy Regex:字符类中的波浪号有什么作用?
【发布时间】:2012-07-12 08:51:27
【问题描述】:

我有这个来自 groovy 代码的正则表达式:

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

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

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

我唯一不明白的是这部分:

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

波浪号在那里做什么?这是一个错误吗?还是只是角色类的一些开关?

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

我尝试用谷歌搜索(当然也在这里搜索过),但不幸的是,该图块属于 groovy 中的“匹配此”运算符,所以我在这里找到的所有内容都是关于如何正则表达式的一般信息。

【问题讨论】:

  • 请重新标记问题以表明您在哪个环境中工作。Java? C#?等等。
  • @Utkanos 现在好点了吗?这件事超出了我的正常工作范围,所以我不知道这很重要。

标签: java regex groovy tilde character-class


【解决方案1】:

波浪号在 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

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

【讨论】:

  • 不幸的是,我对此没有任何权力,我只需要向我的项目经理解释。但我现在可以做到了,谢谢:-)
猜你喜欢
  • 2011-04-26
  • 2017-01-24
  • 2012-12-04
  • 2014-02-22
  • 2011-09-09
  • 2021-11-15
相关资源
最近更新 更多