我正在尝试解析表单的行:

command arg1[ arg2, ... argn]


如:

usemtl weasels


要么

f 1/2/3 4/5/6 7/8/9


这是我的正则表达式:

^(\\w+)(( \\S+)+)$


解析“ usemtl weasels”行时,得到以下捕获组:

Match 0: 'usemtl weasels'
Match 1: 'usemtl'
Match 2: ' weasels'


为什么第二个比赛组之前有空格?它没有出现在Rubular中。

最佳答案

在Java正则表达式中进行分组有点奇怪。组0为您提供正则表达式的完全匹配-在我所知道的所有正则表达式实现中都是相同的。但是组n(对于n> = 1)将为您提供第n个已声明组的最后一个匹配项,而不是找到的第n个匹配项。

您的第二场比赛给您“ weasels”一个前导空格,因为您的模式包含该空格。您声明了第二组(( \\S+)+),并且该组为您提供了第二场比赛。

如果将模式应用于字符串a b c d,则组0将为a b c d,组1将为a,组2将为b c d,组3将为d,因为这是最后一个您的第三个已声明(内部)组( \\S+)的匹配项。

10-06 09:35