Java:正则表达式与if语句

Java:正则表达式与if语句,java,regex,if-statement,Java,Regex,If Statement,我有一个数组,我想搜索以“test”开头的字符串(例如);搜索这些集合前缀的最有效方法是什么?正则表达式还是if语句 正则表达式: boolean found = false; for (String line: ArrayList){ Pattern pattern = Pattern.compile("^test"); //regex Matcher matcher =

我有一个数组,我想搜索以“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();
                         } 
                    }
                }
如果声明:

for (String line : ArrayList) {
       if (line.startsWith("test"){
            doSomething();
            }
哪个效率最高

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

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


如果Regex是答案,那么以“test”开头,后跟“foo”或“bar”的正确语法是什么?但不是两者都有?

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


继续使用if语句。

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

startsWith
可以与“test”甚至“testfoo”一起使用。如果您的意思是
“foo”
可以出现在
“test”
之后的输入中的任何位置(即
“testokfooonothing”
),那么这里应该使用regex

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

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

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

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

4行代码而不是16行代码?不管哪个运行得更快,4行版本的编写效率更高,维护效率更高


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

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

通常,只有当字符串对象上的标准方法不够用时,才应该使用java.util.regex

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

if (matcher.find()) {
    doSoemthing();
}

yopu必须做的第一件事是:put
Pattern=Pattern.compile(“^test”)//regex
位于for
之外,因为编译占用时间,并且必须执行一次且仅执行一次

   Pattern pattern = Pattern.compile("^test.*"); //regex
   for (String line: ArrayList){
       if(patter.matches(line)){
            oSomething();
       }
   }

这个IMO的正则表达式太多了…只是一个旁注:即使在这里使用正则表达式是有意义的,你也应该在循环之外编译模式。如果你有一个块应该负责更多前缀的情况,那就看情况了。如果你理解的话,有些情况下使用正则表达式更容易编码和阅读。也许,但就像你说的,如果你理解的话。在编写代码时,您并不总是维护代码的人;因此,您希望使用对每个人来说都最简单的方法。如果你是唯一一个知道如何使用正则表达式的人,那么你将是唯一一个发现它很容易使用的人,而这不是一个好的实践如果我想找到的不仅仅是“foo”(~20个不同的后缀)或者不仅仅是“test”,那么每一个都会发生什么呢?我问这个问题是因为我收到了if语句的OutOfMemory错误。如果你有更复杂的东西要匹配,那么像正则表达式这样的东西可能是合适的,但这取决于你真正在做什么。对于您提出的问题,答案只是使用
line.startsWith(…)