检查行是否以列表中的内容开头

时间:2012-11-07 16:04:45

标签: java

我有一个如下所示的列表:

List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");

然后我读了一个文件并逐行浏览。我想查看该行的开头是否与列表中的任何内容匹配。

我之前就是这样做的,但这似乎不是实现我想要做的最有效的方式:

/*
if (!strLine.startsWith("//") && !strLine.startsWith("/*") && !strLine.startsWith("*")  && !strLine.startsWith("}") && !strLine.startsWith("{")) {
System.out.println(strLine);
}
*/

有关最佳方法的建议吗?

4 个答案:

答案 0 :(得分:1)

public boolean isInList(List<String> list, String strline){
   for(String message:list){
     if(strline.startsWith(message)){
       return true;
     }
  }
  return false;
}

//Usage
String someString = "something";
List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");

if(isInList(messages,someString)){
   System.out.println("foundMatch");
}

答案 1 :(得分:1)

您可以使用正则表达式和匹配器。但是你不能使用字符串列表,但你可以在运行时构建它。

Matcher m = Pattern.compile("^(//|/\\*|\\*|\\{|\\}).*").matcher("");
if (!matcher.reset(strLine).matches()) {
   // does not start
}

示例:

String str = "abc\n// foo\n/* foo */\nthing\n{bar\n{baz\nlol";
Matcher matcher = Pattern.compile("^(//|/\\*|\\*|\\{|\\}).*").matcher("");
for (String strLine : str.split("\n")) {
    if (!matcher.reset(strLine).matches()) {
        System.out.println(strLine + " does not match");
    }
}

打印:

abc does not match
thing does not match
lol does not match

您可以使用Pattern.quote

动态构建模式
public static Pattern patternOf(List<String> starts) {
    StringBuilder b = new StringBuilder();
    for (String start: starts) {
        b.append("|").append(Pattern.quote(start));
    }
    return Pattern.compile("^(" + b.substring(1) + ").*");
}
// use it like this:
Matcher matcher = patternOf(Arrays.asList("//", "/*", "*", "{", "}")).matcher("");
// produces a pattern like: ^(\Q//\E|\Q/*\E|\Q*\E|\Q{\E|\Q}\E).*

答案 2 :(得分:0)

对于您正在进行的少量测试,这并非不合理。您正在消除循环或迭代器的开销,并且您正在消除正则表达式的解析和执行,如注释所示。

考虑对测试进行排序,以便首先列出四个字符串中最常见的一个。这样测试将尽快通过。

我不认为在宏观计划中这是一个大问题。访问文件将是您正在做的最慢的部分。少数字符串比较没什么。

答案 3 :(得分:0)

Apache Commons Lang很容易:StringUtils.startsWithAny

例如:

List<String> messages = Arrays.asList("//", "/*", "*", "}", "{");
boolean startsWith = StringUtils.startsWithAny("{mystring}", messages.toArray(new String[messages.size()]));