如果我有一个大约3000个字符的文本。我想搜索具有某些特征的字符串,例如[*]
等字符串。
也就是说,我希望从
获取[a]
和[bc]
sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]
我知道有一种名为KMP的算法可以保证通过文本进行线性时间搜索操作,但是这里我没有找到固定的字符串,也许我必须在某个地方使用一些正则表达式。
我怎样才能比O(n ^ 2)更好地做到这一点?如果我使用java,是否有任何光库?
答案 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());
}
如果你有任何疑问,并且真的想要一些你能看到的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("].*?\\[");
这可以通过剥离前导和尾随字符直到并包括第一个/最后一个开/关方括号,然后将一个右括号分割到下一个开始括号(包括)。