Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在文本中搜索特殊字符串的最佳方法_Java_String_Algorithm_Search_Text - Fatal编程技术网

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

Java 在文本中搜索特殊字符串的最佳方法,java,string,algorithm,search,text,Java,String,Algorithm,Search,Text,如果我有一段3000个字符左右的文字。我希望搜索具有特定特征的字符串,例如[*]之类的字符串 也就是说,我想从中获取[a]和[bc] sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc] 我知道有一种叫做KMP的算法,可以保证在文本中进行线性时间搜索操作,但是这里我没有固定的字符串,也许我必须在某个地方使用一些正则表达式 我怎样才能比O(n^2)做得更好?如果我使用java,是否有一些轻量级的库呢?不需要库,您已经有效地描述了regex的一个用例!它们针对搜索进行了高度优化

如果我有一段3000个字符左右的文字。我希望搜索具有特定特征的字符串,例如
[*]
之类的字符串

也就是说,我想从中获取
[a]
[bc]

sjfhshdkfjhskdhfksdf[a]sfdsgfsdf[bc]
我知道有一种叫做KMP的算法,可以保证在文本中进行线性时间搜索操作,但是这里我没有固定的字符串,也许我必须在某个地方使用一些正则表达式


我怎样才能比O(n^2)做得更好?如果我使用java,是否有一些轻量级的库呢?

不需要库,您已经有效地描述了regex的一个用例!它们针对搜索进行了高度优化,在本例中,它们将是

String str=“sjfhshdkfjhskdfkskfksdfksdf[a]sfdsgfsdf[bc]”;
List allMatches=new ArrayList();
Matcher m=Pattern.compile(“\\[^\\]]*]”)。Matcher(str);
while(m.find()){
添加(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));
}
String str=“sjfhshdkfjhskdfkskfksdfksdf[a]sfdsgfsdf[bc]”;
List allMatches=new ArrayList();
对于(inti=str.indexOf('['),j;i!=-1;i=str.indexOf('['),j+1)){
j=str.indexOf(']',i+1);
//如果'j'为-1,则括号不平衡。是否引发异常?
添加(str.substring(i,j+1));
}

以下是一行操作方法:

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

其工作原理是剥离第一个/最后一个开/关方括号内的前导和尾随字符,然后在一个关方括号上拆分到下一个开方括号(包括).

Nice!你对性能有信心吗?懒惰量词似乎可以改进。@4castle性能?我猜这将在10微秒左右执行,这“足够快”。但想想开发人员的性能。更少的代码意味着更少的bug,更少的编写时间。
String[] hits = str.replaceAll("^.*?\\[|][^\\]]*$", "").split("].*?\\[");