我真的很难创建一个找到单词的正则表达式,但是当且仅当它所在的行不以 - 开头时。
例如:
寻找单词: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并不满足这两个。
有关如何处理此事的任何建议?
谢谢!
答案 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
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中将其重新放回文本中。效率不高,但无论如何都应该有效。