我的 Java 项目中有一个正则表达式,它工作正常,但我不明白如何分析它。
允许 #
和*
我不希望他们被允许:
^[^:>#*]+|([^:>#*][^>#*]+[^:>#*])$
最佳答案
让我们剖析一下正则表达式:
^[^:>#*]+|([^:>#*][^>#*]+[^:>#*])$
正则表达式是 ^[^:>#*]+
和 ([^:>#*][^>#* 之间的交替
。因此,如果字符串与 2 个正则表达式中的任何一个匹配,则该正则表达式会匹配该字符串。|
]+[^:>#*])$
如果您使用 Matcher.find()
方法,并假设没有 MULTILINE
标志:
^[^:>#*]+
匹配源字符串开头的子字符串(如果源字符串以以下字符开头)不是:
、>
、#
、*
。([^:>#*][^>#*]+[^:>#*])$
匹配末尾的子字符串源字符串的,如果源字符串以序列结尾:- 非
:>#*
字符 - 一个或多个非
>#*
字符 - 非
:>#*
字符
- 非
请注意,当您将正则表达式与 Matcher.find()
一起使用时,无法保证 ^[^:>#*]+
中字符串的结尾分支,并且无法保证 ([^:>#*][^>#*]+[^:>#*])$
分支中字符串的开头。 Matcher.find()
只要能够找到与正则表达式匹配的子字符串,就会返回 true
。
如果您使用 Matcher.matches()
或 String.matches()
,则整个字符串必须具有以下任一模式[^:>#*]+
或 ([^:>#*][^>#*]+[^:>#*])
。这意味着:
[^:>#*]+
:字符串不得包含:
、>
、#
或*
,且长度必须至少为 1 个字符。OR
([^:>#*][^>#*]+[^:>#*])
:字符串不得包含>
,#
,*
;冒号:
禁止出现在字符串的两端,并且字符串长度必须至少为 3 个字符。
如果是这种情况,那么您的正则表达式已经检查字符串中的 *
和 #
。
关于java - 我如何剖析或分析这个正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361954/