使用matcher.group(索引)获得意外结果

时间:2012-09-08 10:37:51

标签: java regex

我有以下字符串和模式:

String  = <html><body><input type="hidden" name="AvailabilityInputScheduleSelectView$market1" value="5~76AB~|VY~8001~"></input></body></html>
Pattern = AvailabilityInputScheduleSelectView$market1" value="(.*)|VY~(.*)~

我期待:

  

m.group(0)= 5~76AB~(与第一个(。*)匹配的字符)

     

m.group(1)= 8001(与第二个(。*)匹配的字符)

但我明白了:

  

m.group(0)= VY~8001~

     

m.group(1)= null

     

m.group(2)= 8001

如果我只有2个模式(。*),我怎样才能获得3组(0,1,2)?

我尝试了很多组合,但是我无法获得预期的结果。

我不知道在模式中使用不允许的字符是否有问题。我尝试使用引用方法,但它不起作用。

有人能帮助我吗?

2 个答案:

答案 0 :(得分:3)

group(0)总是返回整个匹配的表达式,与调用不带参数的group()相同。
然后,您的两个小组将分别位于小组12中。

您的某个群组null之所以归因于|,其在正则表达式中具有特殊含义,意味着or。由于or每次只会匹配一侧,group(1)group(2)将返回null,具体取决于哪一方不匹配。要获得预期效果,请将|更改为\\|,以便按字面匹配|字符。

答案 1 :(得分:1)

$|添加了转义并将其消费到String的结尾。

String str = "<html><body><input type=\"hidden\" name=\"AvailabilityInputScheduleSelectView$market1\" value=\"5~76AB~|VY~8001~\"></input></body></html>";
Matcher m = Pattern.compile(".*AvailabilityInputScheduleSelectView\\$market1\" value=\"(.*)\\|VY~(.*)~.*").matcher(str);
if (m.matches()) {
    System.out.println("Everything " + m.group(0));
    System.out.println("1st group: " + m.group(1));
    System.out.println("2nd group: " + m.group(2));
}

输出:

Everything <html>..
1st group: 5~76AB~
2nd group: 8001

虽然使用正则表达式解析HTML实际上是bad idea