3

我有一个数组,我想在其中搜索以“test”开头的字符串(例如);搜索这些集合前缀的最有效方法是什么?正则表达式还是 if 语句?

正则表达式:

    boolean found = false;
    for (String line: ArrayList){
                Pattern pattern = 
                Pattern.compile("^test"); //regex

                Matcher matcher = 
                pattern.matcher(line);


                while (matcher.find()) {
                    found = true;
                }
                if(found){
                    doSomething();
                         } 
                    }
                }

if 语句:

for (String line : ArrayList) {
       if (line.startsWith("test"){
            doSomething();
            }

哪个效率最高?

哪种方法对较长的字符串最有效?

如果我想找到以“test”开头的字符串,但只有在“test”之后有“foo”的字符串,哪种方法更好?

如果正则表达式是答案,那么正确的语法是什么,以“test”开头,后跟“foo”或“bar”,但不能同时使用?

4

6 回答 6

6

4 行代码与 16 行代码相比?没关系,哪个运行得更快,4 行版本编写效率更高,维护效率更高。

如果您有一些代码并对其进行了基准测试并确定了特定的瓶颈,那么可能会考虑使其更复杂,否则每次都使用更简单的版本。

于 2012-07-12T15:04:16.407 回答
5

只需使用startsWith. 正则表达式有点矫枉过正,除非您想接受带有前导空格的字符串。

startsWith可以与“test”甚至“testfoo”一起使用。如果您的意思是它"foo"可以出现在"test"(ie "testokokokfoonothing") 之后的输入中的任何位置,那么这里应该使用正则表达式。

您的正则表达式版本代码可以缩短为:

for (String line: ArrayList){
    if (line.matches("^test.*") {
        doSomething();
    }
}

matches()检查整个输入是否与正则表达式匹配,因此需要对正则表达式进行一些修改。上面的代码稍微慢一些,因为Pattern是重新编译的。

于 2012-07-12T15:03:17.313 回答
2

正则表达式会产生相当大的开销;如果你正在做一些有“直接”实现的事情——比如startsWith——那几乎总是会更快。

于 2012-07-12T15:03:24.300 回答
1

我喜欢 IF 语句。就个人而言,我尽可能避免使用正则表达式。它们变得复杂且难以编码。在编码方面,最重要的事情之一是可维护性,而 Regex 不提供这一点。

继续使用 if 语句。

于 2012-07-12T15:03:17.003 回答
1

你应该更喜欢startsWith()。它更惯用、更简洁,而且您不太可能更快地实现某些东西,尤其是使用 java.util.regex,因为编写低效的正则表达式相对容易。

通常,您应该只在 String 对象上的标准方法不够用时才使用 java.util.regex。

关于您的正则表达式代码的一些注意事项,如果您要将正则表达式用于其他内容,则不应在循环内运行 Pattern.compile。你可以通过说进一步简化你的代码:

if (matcher.find()) {
    doSoemthing();
}
于 2012-07-12T15:08:08.197 回答
0

yopu 要做的第一件事:放在Pattern pattern = Pattern.compile("^test"); //regex外面,for因为编译吃时间,而且必须做一次且只有一次。

   Pattern pattern = Pattern.compile("^test.*"); //regex
   for (String line: ArrayList){
       if(patter.matches(line)){
            oSomething();
       }
   }
于 2012-07-13T06:56:48.253 回答