在文本中搜索特殊字符串的最佳方法

时间:2016-06-18 01:15:07

标签: java string algorithm search text

如果我有一个大约3000个字符的文本。我想搜索具有某些特征的字符串,例如[*]等字符串。

也就是说,我希望从

获取[a][bc]
sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]

我知道有一种名为KMP的算法可以保证通过文本进行线性时间搜索操作,但是这里我没有找到固定的字符串,也许我必须在某个地方使用一些正则表达式。

我怎样才能比O(n ^ 2)更好地做到这一点?如果我使用java,是否有任何光库?

2 个答案:

答案 0 :(得分:6)

不需要库,您已经有效地描述了正则表达式的用例!它们针对搜索进行了高度优化,在这种情况下将为O(n)

String str = "sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]";
List<String> allMatches = new ArrayList<>();
Matcher m = Pattern.compile("\\[[^\\]]*]").matcher(str);
while (m.find()) {
    allMatches.add(m.group());
}

Regex Demo

如果你有任何疑问,并且真的想要一些你能看到的O(n),这是一个算法:

String str = "sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]";
List<String> allMatches = new ArrayList<>();
for (int i = str.indexOf('['), j; i != -1; i = str.indexOf('[', j + 1)) {
    j = str.indexOf(']', i + 1);
    // if `j` is -1, the brackets are unbalanced. Perhaps throw an Exception?
    allMatches.add(str.substring(i, j + 1));
}

答案 1 :(得分:0)

以下是如何在一行中完成的:

String[] hits = str.replaceAll("^.*?\\[|][^\\]]*$", "").split("].*?\\[");

这可以通过剥离前导和尾随字符直到并包括第一个/最后一个开/关方括号,然后将一个右括号分割到下一个开始括号(包括)。