我如何剖析或分析这个正则表达式?

时间:2013-05-03 15:00:17

标签: java regex

我的Java项目中有一个正则表达式工作正常,但我不理解如何分析它。

它允许#*,我不希望它们被允许:

 ^[^:>#*]+|([^:>#*][^>#*]+[^:>#*])$

3 个答案:

答案 0 :(得分:1)

正则表达式的分析:

^线的开头
[^:>#*]+一个或多个与:>#*之一不匹配的字符 |
([^:>#*]小组开始,然后是与上述相同的一个字符 [^>#*]+一个或多个与>#*不匹配的字符 [^:>#*])一个与:>#*不匹配的字符,组结束
$行尾

由于您说字符串中未阻止*#,我猜您使用的是Matcher.find()方法。如果是这种情况,我很确定括号是错误的。

^([^:>#*]+|[^:>#*][^>#*]+[^:>#*])$

如果移动括号以将表达式一直包含到行锚标记的开头,它将强制计算整个字符串,而不仅仅是字符串的开头和结尾。

答案 1 :(得分:1)

让我们剖析正则表达式:

^[^:>#*]+|([^:>#*][^>#*]+[^:>#*])$

正则表达式是|^[^:>#*]+之间的替换([^:>#*][^>#*]+[^:>#*])$。因此,如果字符串与2个正则表达式中的任何一个匹配,则正则表达式匹配字符串。

如果您使用Matcher.find()方法,并且假设没有MULTILINE标志:

    如果源字符串的开头字符不是^[^:>#*]+,{{1} },:>

  • #匹配源字符串末尾的子字符串,如果源字符串以序列结尾:

    • *字符
    • 一个或多个非([^:>#*][^>#*]+[^:>#*])$字符
    • :>#*字符

请注意,当您使用带有>#*的正则表达式时,:>#*分支中字符串的结尾没有任何保证,并且Matcher.find()中的字符串开头没有任何保证。分支。只要找到与正则表达式相匹配的子字符串^[^:>#*]+就会返回([^:>#*][^>#*]+[^:>#*])$


如果您使用的是Matcher.find()true,则整个字符串的格式必须为Matcher.matches()String.matches()。这意味着:

  • [^:>#*]+:该字符串不得包含([^:>#*][^>#*]+[^:>#*])[^:>#*]+:>,并且长度必须至少为1个字符。

  • #:字符串不得包含*([^:>#*][^>#*]+[^:>#*])>;字符串的两端禁止冒号#,字符串长度必须至少为3个字符。

如果是这种情况,那么您的正则表达式已经检查了字符串中的*:

答案 2 :(得分:0)

这允许字符串以:>#*之间的任何字符开头和结尾,并且其间的字符不能为{{1} },也不是>,也不是#