我的 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 。#*>#*