0

我的 Java 项目中有一个正则表达式,它运行良好,但我不明白如何分析它。

它允许#并且*我不希望他们被允许:

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

3 回答 3

1

正则表达式分析:

^
[^:>#*]+首 一个或多个字符不匹配:>#*
|Or
([^:>#*]组开始,然后一个字符与上面相同
[^>#*]+一个或多个字符不匹配>#*
[^:>#*])一个字符不匹配:>#*,组结束
$行尾

既然你这么说*并且#在字符串中没有被阻止,我猜你正在使用Matcher.find()方法。如果是这样的话,我很确定括号是放错地方了。

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

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

于 2013-05-03T15:13:01.603 回答
1

让我们剖析正则表达式:

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

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

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

  • ^[^:>#*]+如果源字符串以不是, , ,的字符开头,则匹配源字符串开头的子字符串。:>#*

  • ([^:>#*][^>#*]+[^:>#*])$如果源字符串以序列结尾,则匹配源字符串末尾的子字符串:

    • :>#*字符
    • 一个或多个非>#*字符
    • :>#*字符

请注意,当您将正则表达式与 一起使用时Matcher.find(),不能保证分支中字符串的结尾^[^:>#*]+,也不能保证分支中字符串的开头([^:>#*][^>#*]+[^:>#*])$。只要它可以找到与 regex 匹配的子字符串,Matcher.find()它就会返回。true


如果您使用Matcher.matches()or String.matches(),则整个字符串必须具有[^:>#*]+or的模式([^:>#*][^>#*]+[^:>#*])。意思是:

  • [^:>#*]+: 字符串不能包含:,或>,并且必须至少 1 个字符长。#*

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

如果是这种情况,那么您的正则表达式将已经在字符串中进行*检查。#

于 2013-05-03T15:23:34.507 回答
0

这允许以任何字符开头和结尾的字符串,但:,和>,并且中间的字符不能是, nor , nor 。#*>#*

于 2013-05-03T15:10:59.513 回答