我有一个数组,我想搜索以“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”而不是两者都是正确的语法是什么?
答案 0 :(得分:6)
4行代码与16行相比?不管哪个运行速度更快,4行版本的写入效率更高,维护效率更高。
如果您有一些代码并对其进行基准测试并确定了一个特定的瓶颈,那么可以考虑使其更复杂,否则每次都使用更简单的版本。
答案 1 :(得分:5)
只需使用startsWith
即可。正则表达式有点矫枉过正,除非你想接受带前导空格的String。
startsWith
可以使用" test"甚至" testfoo"。如果您的意思是"foo"
可以出现在"test"
后的输入中的任何位置(即"testokokokfoonothing"
),则应在此处使用正则表达式。
您的正则表达式版本代码可以缩短为:
for (String line: ArrayList){
if (line.matches("^test.*") {
doSomething();
}
}
matches()
检查整个输入是否与正则表达式匹配,因此需要对正则表达式进行一些修改。上面的代码稍慢,因为Pattern
被重新编译。
答案 2 :(得分:2)
正则表达式会产生相当大的开销;如果你正在做一些有“直接”实施的事情 - 比如startsWith
- 几乎总是会更快。
答案 3 :(得分:1)
我喜欢IF语句。就个人而言,如果可能的话,我会避免使用正则表达式。它们变得复杂且难以编码。在编码方面,最重要的一点是可维护性,Regex不提供。
留下if语句。
答案 4 :(得分:1)
你应该更喜欢startsWith()。它更具惯用性,简洁性,并且您不太可能更快地实现某些功能,尤其是使用java.util.regex时,因为编写低效的正则表达式相对容易。
通常,当String对象上的标准方法不够时,您应该只使用java.util.regex。
关于你的Regex代码的一些注意事项,如果你 要使用正则表达式做其他事情,你不应该在你的循环中运行Pattern.compile。您可以通过以下方式进一步简化代码:
if (matcher.find()) {
doSoemthing();
}
答案 5 :(得分:0)
首先要做的事情是:将Pattern pattern = Pattern.compile("^test"); //regex
放在for
之外,因为编译会占用时间,而且必须只执行一次。
Pattern pattern = Pattern.compile("^test.*"); //regex
for (String line: ArrayList){
if(patter.matches(line)){
oSomething();
}
}