假设这*a*
是一个 Java 标识符。我想要一个正则表达式来匹配这样的东西:
\#a
\#a.a.a
(任意次数)
但不是这个:
\#a.
(以点结尾)
所以在这样的阶段:“#aa 小于 #a”。它只会匹配第一个\#a.a
(因为它不以点结尾)。
这个正则表达式:
\#[a-zA-Z_$][\\w$]*(\\.[a-zA-Z_$][\\w$]*)*
几乎可以完成这项工作,但它也符合最后一种情况。
谢谢你。
马科斯
假设这*a*
是一个 Java 标识符。我想要一个正则表达式来匹配这样的东西:
\#a
\#a.a.a
(任意次数)
但不是这个:
\#a.
(以点结尾)
所以在这样的阶段:“#aa 小于 #a”。它只会匹配第一个\#a.a
(因为它不以点结尾)。
这个正则表达式:
\#[a-zA-Z_$][\\w$]*(\\.[a-zA-Z_$][\\w$]*)*
几乎可以完成这项工作,但它也符合最后一种情况。
谢谢你。
马科斯
您几乎做对了,但需要进行一些小的调整。考虑这个正则表达式:
#[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*(?!\w*\.)
翻译成Java:
(?i)#[a-z_$][\\w$]*(?:\\.[a-z_$][\\w$]*)*(?!\\w*\\.)
这可以通过否定前瞻来完成。这首先寻找“#text_$”。然后它会查找“.text_$”或更多次。如果匹配以 0 个或多个“text_$”和句点结尾,则匹配无效。这是假设i
修改器已打开。
起初我只是检查它是否没有以句点结尾,但这只会带走比赛中的最后一个字符。
\\#([a-z_$][a-z_$\d]*)(\.[a-z_$][a-z_$\d]*)*(?![a-z_$\d]*\.)
\#abc => YES
\#abc.abc => YES
\#abc.a23.abc => YES
\#abc.abc.abc. => NO
\#abc.2bc.abc => NO