0

我正在尝试获取在文档中找到的每个模式的索引。到目前为止,我有:

    String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test";
    Pattern pattern = Pattern.compile("HelloWorld");
    Matcher matcher = pattern.matcher(temp);
    int current = 0;
    int start;
    int end;

    while (matcher.find()) {
        start = matcher.start(current);
        end = matcher.end(current);
        System.out.println(temp.substring(start, end));
        current++;
    }

由于某种原因,它一直只找到in的第一个实例,HelloWorldtemp这会导致无限循环。老实说,我不确定你是否可以使用matcher.start(current)and matcher.end(current)- 这只是一个疯狂的猜测,因为matcher.group(current)之前工作过。这次我需要实际的索引,但matcher.group()对我不起作用。

4

6 回答 6

2

不要将索引传递给start(int)and end(int)。API 声明参数是组号。在您的情况下,只有零是正确的。使用start()andend()代替。

由于您对以下内容的调用,匹配器将在每次迭代中移至下一个匹配项find()

此方法从输入序列的开头开始,或者,如果该方法的先前调用成功并且匹配器此后尚未重置,则从与先前匹配不匹配的第一个字符开始。

于 2013-01-10T08:34:03.630 回答
2

将正则表达式修改为如下所示:

while (matcher.find()) {
    start = matcher.start();
    end = matcher.end();
    System.out.println(temp.substring(start, end));
}
于 2013-01-10T08:25:52.340 回答
1

问题是这行代码。

 start = matcher.start(current);

current第一次迭代后为 1。

于 2013-01-10T08:34:02.357 回答
1

如果您只需要匹配文本的开始和结束偏移量,则不需要当前组,这样就可以了:

    String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test";
    Pattern pattern = Pattern.compile("HelloWorld");
    Matcher matcher = pattern.matcher(temp);
    int current = 0;

    while (matcher.find()) {
        System.out.println(temp.substring(matcher.start(), matcher.end()));
    }
于 2013-01-10T08:34:20.203 回答
1
while (matcher.find()) {
    start = matcher.start();
    end = matcher.end();
    System.out.println(temp.substring(start, end));
}

会做你想做的。

于 2013-01-10T08:38:39.173 回答
0
    String temp = "This is a test to see HelloWorld in a test that sees HelloWorld in a test";
    Pattern pattern = Pattern.compile("HelloWorld");
    Matcher m = pattern.matcher(temp);
    while (matcher.find()) {
        System.out.println(temp.substring(m.start(), m.stop()));
    }
于 2020-08-18T03:37:13.067 回答