如何在正则表达式中发现*?

时间:2013-11-16 22:23:57

标签: java regex

我想查找并删除其中包含***的所有行。我怎样才能做到这一点?

我尝试使用正则表达式但得到了

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 6

这是我的正则表达式:(?m)^**.*

.........text...........
***..........text....... //want to delete this line
........................

5 个答案:

答案 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,如其他答案所说。)

(假设你一次只读一行,而不是一个大的长缓冲区包含所有带换行符的行。其他一些答案处理后一种情况。)