1

假设这*a*是一个 Java 标识符。我想要一个正则表达式来匹配这样的东西:

\#a \#a.a.a任意次数)

但不是这个:

\#a.(以点结尾)

所以在这样的阶段:“#aa 小于 #a”。它只会匹配第一个\#a.a(因为它不以点结尾)。

这个正则表达式:

\#[a-zA-Z_$][\\w$]*(\\.[a-zA-Z_$][\\w$]*)*

几乎可以完成这项工作,但它也符合最后一种情况。

谢谢你。

马科斯

4

2 回答 2

2

您几乎做对了,但需要进行一些小的调整。考虑这个正则表达式:

#[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*(?!\w*\.)

现场演示:http ://www.rubular.com/r/kJbSJKHhtv

翻译成Java:

(?i)#[a-z_$][\\w$]*(?:\\.[a-z_$][\\w$]*)*(?!\\w*\\.)
于 2013-07-18T12:19:32.847 回答
2

这可以通过否定前瞻来完成。这首先寻找“#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

试试看

于 2013-07-18T12:11:23.140 回答