正则表达式查找不在一行中的匹配单词

时间:2016-06-17 04:49:12

标签: java regex

我真的很难创建一个找到单词的正则表达式,但是当且仅当它所在的行不以 - 开头时。

例如:

寻找单词:if

-- check if //should not match
-- more random words if //should not match
check if //should match

我尝试使用负面的外观,如:

(?<!-- .*)\bif\b

但是我使用的是JAVA,而且,我不能在外观中使用量词。

如果我尝试

(?<! -- )\bif\b

它适用于

-- if \\works
--  if \\does not work

我发现了SKIP和F的用法,但似乎JAVA并不满足这两个。

有关如何处理此事的任何建议?

谢谢!

2 个答案:

答案 0 :(得分:0)

假设您正在使用Java 8,您可以执行以下操作:

    Pattern p = Pattern.compile("^(?!--).*if");
    Predicate<String> pred = s -> {return p.matcher(s).find();}; 
    Files.lines(Paths.get("files/input.txt"))
         .filter(pred).forEach(System.out::println);

它被称为negative look ahead。我希望它有所帮助。

答案 1 :(得分:0)

我不知道你的线条有多长,但你可以使用这种丑陋的构造(当然数字可能更小):

(?m)(?<!^--.{0,99999999999999999})if

EXAMPLE

Java允许一些区间量词在后面看并向前看,但它只是看起来错了:P然而它起作用,至少它在我的例子中适用于我。

另一种方法,如果我想放弃所有出现,为什么不使用捕获组呢?像:

String[] examples = {"-- check if ",
        "-- more random words if ",
        "check if ", "-- f",
        "-- check if \n-- more random words if \ncheck if "};
for(String string : examples) {
    System.out.println(string.replaceAll("(?m)(?!^--)^(.*?)if","$1" + "replacement"));
    System.out.println();
}

正则表达式(?m)(?!^--)^(.*)(if)将匹配搜索到的单词并将其捕获到组1中,然后在raplacement中将其重新放回文本中。效率不高,但无论如何都应该有效。