正则表达式匹配有效的Java路径标识符

时间:2013-07-18 12:02:17

标签: regex

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

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

但不是这样:

\#a.(以点结尾)

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

这个正则表达式:

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

差不多完成了这项工作,但它也符合最后一个案例。

谢谢。

马科斯

2 个答案:

答案 0 :(得分: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

Try it out

答案 1 :(得分: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*\\.)