查找最后一组正则表达式的第一个元素的索引?

时间:2014-11-12 09:19:53

标签: java regex string regex-lookarounds

我有以下问题:我有一组看起来像这样的字符串:

"01100110011"
"11100110010"
"10001110000"

是否可以编写一个正则表达式,找到最后一组中的第一个索引?我目前正在使用散列图和大量与lastindexof indexof等相关的计算。但此时它开始看起来很荒谬。

1 个答案:

答案 0 :(得分:2)

这很简单,编译以下正则表达式并搜索与Matcher.find()的第一个匹配项:

".*(?<!1)(1)"

您可以通过调用.start(1)对象上的Matcher来获取索引。

正则表达式基本上找到最后一个1,它不会立即在另一个(?<!1)之前找到,它有效地找到连续1的最后一组中的第一个。{/ p >

示例代码:

int startingIndexOfLastGroup(String str) {
    Pattern p = Pattern.compile(".*(?<!1)(1)");
    Matcher m = p.matcher(str);

    if (m.find()) {
        return m.start(1);
    }

    // Return -1 for a string without 1
    return -1;
}

上面的正则表达式很简单,但不是很好,因为它回溯了很多。如果您不想要太多回溯,可以使用以下正则表达式:

"(?:[^1]*+(1+))*+"

简单地说,它将搜索0个或更多非1个字符[^1]*+,然后搜索1(1+)中的一个或多个,并重复此类序列尽可能多的时间。由于重复捕获组仅存储上次捕获的索引,因此它将有效记录最后一组连续1的起始索引。