Java正则表达式问题

时间:2009-06-09 19:07:34

标签: java regex

我有一组如下所示的行:

tb-set-node-recipe $vpn1   W2K3_SP2_VPN_SRV
tb-set-node-os     $vpn2   I_W2K3_SP2_VPN_SRV
tb-set-node-os     $xpcli1 I_XP_SP3_VPN_CLI
tb-set-node-os     $xpcli2 I_XP_SP2_VPN_CLI
tb-set-node-os     $xpcli3 I_XP_SP1_VPN_CLI
tb-set-node-recipe $ftp1   FC8_KS_FTP_SRV
tb-set-node-os     $smb1   XP_SP3-STD
tb-set-node-recipe $web1   FC8_KS_WEB_SRV

我在Java语言中使用以下正则表达式来解析tb-set-node-os语句:

(tb\-set\-node\-os)\s+[\$\w]+\s+\w+

除了包含$smb1

的倒数第二行外,它的工作正常

有没有人知道为什么会这样?我似乎无法想出这个。提前谢谢!

3 个答案:

答案 0 :(得分:8)

\w与连字符(-)不匹配,因此您需要对其进行调整:

(tb\-set\-node\-os)\s+[\$\w]+\s+[\w-]+

请注意,-不需要转义(但可以),如果它是字符类中的第一个或最后一个,但如果它位于类的中间,则必须进行转义。 / p>


同样值得一提的是,当您拥有顺序互斥的项目时,您可以使用所有格量词来提高性能:

(tb\-set\-node\-os)\s++[\$\w]++\s++\w++

由于\s永远不会匹配\w(反之亦然),所以可以使用占有量词(*+++)代替通常的贪婪词,将避免/防止任何潜在的回溯。

答案 1 :(得分:6)

可能这是因为短划线 - 不是单词字符(与\ w不匹配),所以这样的东西可能会起作用:

(tb\-set\-node\-os)\s+[\$\w]+\s+[\w\-]+

答案 2 :(得分:1)

我看到的唯一问题是$ smb1行在最后一列中有一个连字符,似乎与\ w不匹配。你可以尝试。+在表达的最后。