我有以下问题:我有一组看起来像这样的字符串:
"01100110011"
"11100110010"
"10001110000"
是否可以编写一个正则表达式,找到最后一组中的第一个索引?我目前正在使用散列图和大量与lastindexof indexof等相关的计算。但此时它开始看起来很荒谬。
答案 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
的起始索引。