假设*a*
是Java标识符。我想要一个正则表达式来匹配这样的事情:
\#a
\#a.a.a
( a 任意次数)
但不是这样:
\#a.
(以点结尾)
所以在这样的阶段:“#aa小于#a。”它只匹配第一个\#a.a
(因为它不以点结尾)。< / p>
这个正则表达式:
\#[a-zA-Z_$][\\w$]*(\\.[a-zA-Z_$][\\w$]*)*
差不多完成了这项工作,但它也符合最后一个案例。
谢谢。
马科斯
答案 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
答案 1 :(得分:2)
你几乎做对了,但需要做一些小的调整。考虑一下这个正则表达式:
#[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*(?!\w*\.)
转换为Java:
(?i)#[a-z_$][\\w$]*(?:\\.[a-z_$][\\w$]*)*(?!\\w*\\.)