Java 使用.obj文件的简单正则表达式有困难

Java 使用.obj文件的简单正则表达式有困难,java,regex,Java,Regex,我正在尝试分析表单的行: command arg1[ arg2, ... argn] 例如: usemtl weasels 或 这是我的正则表达式: ^(\\w+)(( \\S+)+)$ 当我解析行usemtl weasels时,我得到以下捕获组: Match 0: 'usemtl weasels' Match 1: 'usemtl' Match 2: ' weasels' 为什么在第二组比赛之前有空格?它没有出现在Rubular中。在java正则表达式中分组有点奇怪。组0为您提供了与正

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

command arg1[ arg2, ... argn]
例如:

usemtl weasels

这是我的正则表达式:

^(\\w+)(( \\S+)+)$
当我解析行usemtl weasels时,我得到以下捕获组:

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

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

在java正则表达式中分组有点奇怪。组0为您提供了与正则表达式完全匹配的结果-我知道的所有正则表达式实现都是如此。但是n>=1的组n将为您提供第n个声明组的最后一个匹配项,而不是找到的第n个匹配项

你的第二个匹配给了你一个前导空白的“黄鼠狼”,因为你的模式包含那个空白。您声明了第二个组\\S++并且该组为您提供了第二个匹配项


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

Hm。从我的角度来看,第n个已声明组的最后一个匹配项是唯一符合逻辑的。什么正则表达式引擎给你找到的第n个匹配?这毫无意义。好吧,也许只有我对此感到困惑,因为我希望即使一组匹配多次,也能引用所有匹配项。按照你的逻辑,这是否意味着在a*b中,b将根据a匹配的频率由不同的数字表示?那是不对的NET framework[支持CaptureCollection]允许您执行此类操作。然而,对于正则表达式引擎来说,这是一个相当不寻常的特性。
Match 0: 'usemtl weasels'
Match 1: 'usemtl'
Match 2: ' weasels'