在java中匹配数组与字符串

时间:2009-11-04 08:40:01

标签: java arrays string match

我正在使用bufferedreader读取文件,所以我要说

line = br.readLine();

我想检查这一行是否包含许多可能的字符串之一(我在一个数组中)。我希望能够写出类似的内容:

while (!line.matches(stringArray) { // not sure how to write this conditional
  do something here;
  br.readLine();
}

我是编程和Java的新手,我是否正确地采用了这种方式?

3 个答案:

答案 0 :(得分:3)

将所有值复制到Set<String>,然后使用contains()

Set<String> set = new HashSet<String> (Arrays.asList (stringArray));
while (!set.contains(line)) { ... }

[编辑]如果你想知道行的一部分是否包含该集合中的字符串,你必须遍历该集合。将set.contains(line)替换为:

public boolean matches(Set<String> set, String line) {
    for (String check: set) {
        if (line.contains(check)) return true;
    }
    return false;
}

使用正则表达式或更复杂的匹配方法时,相应地调整检查。

[EDIT2]第三个选项是在一个巨大的正则表达式中使用|连接数组中的元素:

Pattern p = Pattern.compile("str1|str2|str3");

while (!p.matcher(line).find()) { // or matches for a whole-string match
    ...
}

如果数组中有许多元素,这可能会更便宜,因为正则表达式代码将优化匹配过程。

答案 1 :(得分:2)

这取决于stringArray是什么。如果它是Collection那么很好。如果它是一个真正的数组,你应该使它成为CollectionCollection界面有一个名为contains()的方法,用于确定给定的Object是否在Collection中。

将数组转换为Collection的简单方法:

String tokens[] = { ... }
List<String> list = Arrays.asList(tokens);

List的问题是查找费用昂贵(技术上线性或O(n))。更好的选择是使用Set,它是无序的,但具有接近常量(O(1))的查找。你可以构建一个这样的:

来自Collection

Set<String> set = new HashSet<String>(stringList);

从数组:

Set<String> set = new HashSet<String>(Arrays.asList(stringArray));

然后set.contains(line)将是一项廉价的操作。

编辑:好的,我认为你的问题不明确。您想查看该行是否包含数组中的任何单词。你想要的是这样的:

BufferedReader in = null;
Set<String> words = ... // construct this as per above
try {
  in = ...
  while ((String line = in.readLine()) != null) {
    for (String word : words) {
      if (line.contains(word)) [
        // do whatever
      }
    }
  }
} catch (Exception e) {
  e.printStackTrace();
} finally {
  if (in != null) { try { in.close(); } catch (Exception e) { } }
}

这是一个非常粗略的检查,使用令人惊讶的开放,往往会给像“废料”这样的词语带来恼人的误报。对于更复杂的解决方案,您可能必须使用正则表达式并查找单词边界:

Pattern p = Pattern.compile("(?<=\\b)" + word + "(?=\b)");
Matcher m = p.matcher(line);
if (m.find() {
  // word found
}

您可能希望更有效地执行此操作(例如不使用每行编译模式),但这是使用的基本工具。

答案 2 :(得分:0)

使用String.matches(regex)函数,创建一个匹配字符串数组中任何一个字符串的正则表达式怎么样?像

这样的东西
String regex = "*(";
for(int i; i < array.length-1; ++i)
  regex += array[i] + "|";
regex += array[array.length] + ")*";
while( line.matches(regex) )
{
  //. . . 
}