【问题标题】:Decode Regex expression - ^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\\]^_`{|}~]+$解码正则表达式 - ^[a-zA-Z0-9 "'&!#$%()*+,-./:;?@[\\]^_`{|}~]+$
【发布时间】:2014-11-12 10:51:08
【问题描述】:

使用 Java

我不是正则表达式的常客,我在将 springmodules-validation 内容迁移到最新版本时遇到了以下正则表达式。

^[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 \"'&!#$%()*+,-./:;?@\\[\\]^_`{|}~]+$"

通过这种方式,我将它分配给了一个字符串,这对我来说非常有效,谢谢大家!

【问题讨论】:

  • 字符实体如 " ’等不在正则表达式中解释。这是从一些xml中提取的吗?您必须将它们翻译成原始字符。
  • 看起来我应该在 xml/xhtml 中使用&amp;quot;&amp;apos;&amp;amp; 这些,在我的表达中我应该替换这些。这是问题吗?如果是这样,我必须用 \ 来逃避这个吗?
  • @UweAllner 说得好。我该如何替换它们?所有这些都需要逃脱吗?还是只有&amp;quot
  • 当您在 xml 文件之外使用表达式(例如注释)时,您必须使用 " 而不是 "。否则字符 &、q、u、o、t 和 ;匹配。
  • @UweAllner 是的,抱歉我忘记更新了。您的解决方案就像一个魅力。谢谢!

标签: java regex hibernate-validator spring-modules


【解决方案1】:

翻译后的表达式看起来像

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

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

【讨论】:

  • 请记住,如果要在字符类中包含连字符,则需要小心,它通常需要位于类的开头或结尾,因为它表示范围的其他任何地方。在这种 specific 情况下,它实际上会起作用 - ",-." 被视为范围表达式(从逗号到点包括在内),但代码位于逗号和点之间的唯一字符是...连字符!
  • 似乎是这个表达式的创造者的一些诡计(或者只是纯粹的巧合)。我刚刚翻译了它,但感谢您的评论!它很容易被忽视。
  • @UweAllner!我在我的 java 程序中尝试过,pattern = Pattern.compile("^[a-zA-Z0-9 \"'&amp;!#$%()*+,-./:;?@[\\]^_{|}~]+$"); boolean isValid = pattern.matcher(targetStringToValidate).matches(); 但仍然有相同的java.util.regex.PatternSyntaxException: Unclosed character class 我认为 java 中的字符串转义字符有问题。请帮忙!
  • @Diablo 哦,对不起;当然,左方括号也必须转义。我已经在我的回答中修复了它。
【解决方案2】:

您可以在 Perl 或 RegexBuddy 中使用 YAPE::Regex::Explain 之类的东西来获取正则表达式的详细描述。一个凌乱的单行可以在下面找到:

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

从标准输入提供正则表达式后:

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 事物的一部分。

【讨论】:

  • 是的,我正在将遗留的 xml 配置重构为 java 注释,我需要这个表达式作为 Java 字符串
  • 啊,有道理 - 我猜你不需要 Java 中的 XML 转义。请参阅:en.wikipedia.org/wiki/… - 所以 &变成 & 以此类推。
  • YAPE::Regex::Explain 在这里没有帮助,因为这个问题是 Java 特有的,它总是将未转义的 [ 视为嵌套字符类的开头。 RegexBuddy 正确地标记了错误,假设您将 Java 指定为风格并减少双反斜杠。 (其实我很奇怪为什么它加倍;反斜杠在XML中没有特殊意义。)
猜你喜欢
  • 2015-01-07
  • 2021-11-09
  • 2010-12-11
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多