问题描述
我有以下模式:
<* ab: cdef *>
<************>
abc: <starting now>
我需要转义具有<*模式的行。
我已经使用\\\\*
和\\\\\\\\*
来转义\\和*。
但这行不通
如何使用Java在正则表达式中转义*?
我无法逃避单独有<的行,因为其他行也会被跳过。
我用下面的代码:
if(str.matches("<\\*.*")) {
//Do nothing.
}
通过使用BufferedReader初始化str,如下所示:
FileInputStream fstream = new FileInputStream(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String str = br.readLine();
1楼
要在正则表达式中转义*
,您需要双反斜杠: \\\\*
因为*
是正则表达式中的特殊字符。
您也可以尝试这样做(如果您希望这种模式出现在行的开头,如您的示例所示):
if (str.trim().startsWith("<*")) {
//your code
}
因此,如果您希望模式出现在字符串中的任何位置,则可以使用:
if (str.contains("<*")) {
//your code
}
而且我很确定在这些简单的情况下您不需要正则表达式。
2楼
您还应该在'<'字符前匹配空格,例如
if(str.trim().matches("<\\*.*")) {
//Do nothing.
}
或str.matches("\\\\s*<\\\\*.*")
。
您还应该迭代阅读下一行,例如:
while ((str = br.readLine()) != null) {
if(str.trim().matches("<\\*.*")) {
//Do nothing.
} else {
//else do something...
}
}
(在OP中不清楚)
3楼
可能认为该模式不匹配,因为调试器无法在空的if
块内停止- 不执行任何操作始终是一个坏习惯: 执行某些操作 !
您的模式已经符合以下情况:
String str = "<* ab: cdef *>";
if(str.matches("<\\*.*")) {
//do something
System.out.println("matches");
}
上面的照片匹配 。
如果您不希望考虑多余的前导空格,则可以使用此模式" *<\\\\*.*"
,该模式匹配零个或多个前导空白字符。