Java正则表达式问题

jtb*_*dle -1 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
Run Code Online (Sandbox Code Playgroud)

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

(tb\-set\-node\-os)\s+[\$\w]+\s+\w+
Run Code Online (Sandbox Code Playgroud)

除了包含的倒数第二行之外,它工作正常 $smb1

有谁知道为什么会这样?我似乎无法想出这个.提前致谢!

Pet*_*ton 8

\w与hyphen(-)不匹配,所以你需要调整它:

(tb\-set\-node\-os)\s+[\$\w]+\s+[\w-]+
Run Code Online (Sandbox Code Playgroud)

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


同样值得一无所知,当您拥有连续的互斥项时,您可以使用所有格量词来提高性能:

(tb\-set\-node\-os)\s++[\$\w]++\s++\w++
Run Code Online (Sandbox Code Playgroud)

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


Zef*_*mel 6

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

(tb\-set\-node\-os)\s+[\$\w]+\s+[\w\-]+
Run Code Online (Sandbox Code Playgroud)