【发布时间】:2019-10-19 19:23:03
【问题描述】:
我需要找到字符串中字符集的最后一个索引。考虑字符集是 x,y,z 和字符串作为 Vereador Luiz Pauly Home 然后我需要索引作为 18。
因此,为了找到索引,我创建了一个带有 DOTALL 标志和 贪婪量词 作为 (?s).*(x|y|z) 的模式。当模式应用于该字符串(多行)时,我可以从起始组中找到索引。代码:
int findIndex(String str){
int index = -1;
Pattern p = Pattern.compile("(?s).*(x|y|z)");
Matcher m = regex.matcher(str);
if(m.find()){
index = m.start(1);
}
return index;
}
正如预期的那样,如果匹配,它会正确返回值。
但如果没有匹配,则需要很长时间(600000 个字符需要 17 分钟),因为它是贪婪匹配。
我尝试使用其他量词,但无法获得所需的输出。 那么任何人都可以参考更好的正则表达式吗?
PS:我也可以考虑从最后遍历内容并找到索引。但我希望正则表达式中有更好的方法可以快速完成这项工作。
【问题讨论】:
-
为什么不直接删除
.*,然后将if改为while? -
我很确定三个“lastIndexOf”并且比较结果比任何 RegEx 都快
-
试试
"([xyz])(?=[^xyz]*$)"。开头使用.*总是会导致很多回溯。 -
你有使用正则表达式吗?
-
似乎是一个解决方案。会尝试一下。谢谢@AndyTurner
标签: java regex regex-greedy