我的 Java 项目中有一个正则表达式,它运行良好,但我不明白如何分析它。
它允许#
并且*
我不希望他们被允许:
^[^:>#*]+|([^:>#*][^>#*]+[^:>#*])$
正则表达式分析:
^
行
[^:>#*]+
首 一个或多个字符不匹配:>#*
|
Or
([^:>#*]
组开始,然后一个字符与上面相同
[^>#*]+
一个或多个字符不匹配>#*
[^:>#*])
一个字符不匹配:>#*
,组结束
$
行尾
既然你这么说*
并且#
在字符串中没有被阻止,我猜你正在使用Matcher.find()
方法。如果是这样的话,我很确定括号是放错地方了。
^([^:>#*]+|[^:>#*][^>#*]+[^:>#*])$
如果括号移动到包含表达式一直到行锚标记的开头,它将强制评估整个字符串,而不仅仅是字符串的开头和结尾。
让我们剖析正则表达式:
^[^:>#*]+|([^:>#*][^>#*]+[^:>#*])$
正则表达式是和|
之间的交替。因此,如果字符串与 2 个正则表达式中的任何一个匹配,则该正则表达式匹配一个字符串。^[^:>#*]+
([^:>#*][^>#*]+[^:>#*])$
如果您正在使用Matcher.find()
方法,并假设没有MULTILINE
标志:
^[^:>#*]+
如果源字符串以不是, , ,的字符开头,则匹配源字符串开头的子字符串。:
>
#
*
([^:>#*][^>#*]+[^:>#*])$
如果源字符串以序列结尾,则匹配源字符串末尾的子字符串:
:>#*
字符>#*
字符:>#*
字符请注意,当您将正则表达式与 一起使用时Matcher.find()
,不能保证分支中字符串的结尾^[^:>#*]+
,也不能保证分支中字符串的开头([^:>#*][^>#*]+[^:>#*])$
。只要它可以找到与 regex 匹配的子字符串,Matcher.find()
它就会返回。true
如果您使用Matcher.matches()
or String.matches()
,则整个字符串必须具有[^:>#*]+
or的模式([^:>#*][^>#*]+[^:>#*])
。意思是:
[^:>#*]+
: 字符串不能包含:
,或>
,并且必须至少 1 个字符长。#
*
OR ([^:>#*][^>#*]+[^:>#*])
: 字符串不能包含>
, #
, *
; 字符串两端禁止冒号:
,字符串长度必须至少为 3 个字符。
如果是这种情况,那么您的正则表达式将已经在字符串中进行*
检查。#
这允许以任何字符开头和结尾的字符串,但:
,和>
,并且中间的字符不能是, nor , nor 。#
*
>
#
*