我的Java项目中有一个正则表达式工作正常,但我不理解如何分析它。
它允许#
和*
,我不希望它们被允许:
^[^:>#*]+|([^:>#*][^>#*]+[^:>#*])$
答案 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} },也不是>
,也不是#
。