解码正则表达式 - ^ [a-zA-Z0-9“'&!#$%()* +, - 。/:;?@ [\\] ^ _` {|}〜] + $

时间:2014-11-12 10:51:09

标签: java regex hibernate-validator spring-modules

使用Java

我不是常规正则表达式,我遇到了以下正则表达式作为springmodules验证内容迁移到最新版本的一部分。

^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\\]^_`{|}~]+$

这究竟是做什么的?我需要了解这一点,将单元测试写入此验证。顺便说一句,我在Java项目中使用它。

另一个有趣的事情,我在hibernate-validator中尝试了这个表达式,如下所示:

@Pattern(regexp = "^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\\]^_`{|}~]+$")

然后我的intellijIDEA在行末显示错误 Unclosed character class 。 正则表达式是否正确形成?

更新

表达似乎格式不正确,我在尝试测试时看到以下异常:

java.util.regex.PatternSyntaxException: Unclosed character class near index 57
^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\]^_`{|}~]+$

以下是我尝试迁移的其中一个xml文件的原始表达式:

<regexp apply-if="creativeType == 'Text'" expression="^[a-zA-Z0-9 

&quot;&apos;&amp;!#$%()*+,-./:;?@[\\]^_`{|}~]+$"/>

我错过了什么吗?

工作解决方案

regexp = "^[a-zA-Z0-9 \"'&!#$%()*+,-./:;?@\\[\\]^_`{|}~]+$"

这样我就把它分配给了一个字符串,这对我来说很完美。谢谢大家!

2 个答案:

答案 0 :(得分:4)

翻译后的表达式看起来像

^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@\[\]^_`{|}~]+$

表示一行字母,数字和一组其他字符(如不同的括号,其中]必须转义,不代表字符类的结尾。)

答案 1 :(得分:0)

您可以在Perl或RegexBuddy中使用类似YAPE :: Regex :: Explain的内容来获取正则表达式的详细说明。可以在下面找到凌乱的单行:

perl -MYAPE::Regex::Explain -e \
'$e=<>; print YAPE::Regex::Explain->new($e)->explain';

从stdin提供正则表达式后:

The regular expression:

^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\]^_`{|}~]+$

matches as follows:

NODE                       EXPLANATION
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  ^                        the beginning of the string
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  [a-zA-Z0-9               any character of: 'a' to 'z', 'A' to 'Z',
  "'&!#$%()*+,-             '0' to '9', ' ', '"', ''', '&', '!', '#',
  ./:;?@[\]^_`{|}~]+       '$', '%', '(', ')', '*', '+', ',' to '.',
                           '/', ':', ';', '?', '@', '[', '\]', '^',
                           '_', '`', '{', '|', '}', '~' (1 or more
                           times (matching the most amount possible))
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  $                        before an optional \n, and the end of the
                           string
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

使用像Regex Buddy之类的东西可以让你为正则表达式选择Java风格,但在这种情况下它应该是非常标准的。

你确定这是Java吗?从逃避它看起来更像是XSD / XPath / XML的一部分。