我想查找并删除其中包含***
的所有行。我怎样才能做到这一点?
我尝试使用正则表达式但得到了
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 6
这是我的正则表达式:(?m)^**.*
。
.........text...........
***..........text....... //want to delete this line
........................
答案 0 :(得分:4)
正则表达式中的*
字符具有特殊含义。要显示模式,你并不意味着这个特殊含义,你必须“逃避”它。最简单的方法是将表达式放在Pattern.quote()
。
例如:
String searchFor = Pattern.quote("***");
然后使用该字符串进行搜索
答案 1 :(得分:1)
请注意,*
是正则表达式中的特殊字符,因此您必须使用\\*
您的表达式为:(?m)^\\*\\*.\\*
答案 2 :(得分:1)
这不是完美的,但它会让你开始:
// 4 lines, 2 of each containing "***" at random locations
String input = "abc***def\nghijkl\n***mnop\n**blah";
// replacing multiline pattern starting with any character 0 or more times,
// followed by 3 escaped "*"s,
// followed by any character 0 or more times
System.out.println(input.replaceAll("(?m).*\\*{3}.*", ""));
输出:
ghijkl
**blah
答案 3 :(得分:1)
如果三个星号并不总是在行的开头,您也可以使用此模式删除换行符:
(\r?\n)?[^\r\n*]*\Q***\E.*((1)?|\r?\n?)
答案 4 :(得分:1)
如果您正在做的只是在字符串中查找三个特定字符,则根本不需要正则表达式:
if (line.contains("***")) {
...
}
(但是如果事情变得更复杂并且您确实需要正则表达式,那么请使用反斜杠或Pattern.quote
,如其他答案所说。)
(假设你一次只读一行,而不是一个大的长缓冲区包含所有带换行符的行。其他一些答案处理后一种情况。)