当我使用以下代码时出现错误:
Matcher matcher = pattern.matcher("/Date\(\d+\)/");
错误是:
invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
我还尝试将括号中的值更改为('/Date\(\d+\)/')
;没有任何成功。
如何避免此错误?
答案 0 :(得分:5)
您需要双重转义\
字符,如下所示:\\
。
否则,您的String
会被解释为您试图逃离(
。
与另一个圆括号和d相同。
事实上,您似乎在尝试初始化Pattern
,而pattern.matcher
引用了您希望Pattern
匹配的文字。
最后请注意,在Pattern
中,转义字符需要双重转义,因此:
\\(\\d+\\)
此外,正如Rohit所说,Java中的Pattern
不需要被正斜杠(/
)包围。
事实上,如果你像这样初始化一个Pattern
,它会将你的Pattern
解释为以文字正斜杠开头和结尾。
以下是您可能想要做的一个小例子:
// your input text
String myText = "Date(123)";
// your Pattern initialization
Pattern p = Pattern.compile("Date\\(\\d+\\)");
// your matcher initialization
Matcher m = p.matcher(myText);
// printing the output of the match...
System.out.println(m.find());
输出:
true
答案 1 :(得分:1)
你的正则表达式本身是正确的 ,但在Java中,反斜杠字符本身需要被转义。
因此,这个正则表达式:
/Date\(\d+\)/
必须变成这个:
/Date\\(\\d+\\)/
一个反斜杠用于转义括号或d
。另一个是逃避反斜杠本身。
您收到的错误消息是因为Java认为您正在尝试将\(
用作单个转义字符,例如\n
或任何其他示例。但是,\(
不是有效的转义序列,因此Java抱怨。
此外,您的代码逻辑可能不正确。 matcher
的参数应该是要搜索的文本(例如," / Date(234)/ Date(6578)/"),而变量pattern
应包含模式本身。试试这个:
String textToMatch = "/Date(234)/Date(6578)/";
Pattern pattern = pattern.compile("/Date\\(\\d+\\)/");
Matcher matcher = pattern.matcher(textToMatch);
最后,正则表达式字符类\d
表示"一个数字。"如果您尝试引用文字短语\\d
,则必须使用\\\\d
来避开此问题。但是,在这种情况下,您的正则表达式将是常量,您可以更轻松地使用textToMatch.indexOf
和textToMatch.contains
。
答案 2 :(得分:0)
要在java中转义正则表达式,您还可以使用Pattern.quote()