如何转义正则表达式中的字符

时间:2013-08-10 15:26:54

标签: java regex

当我使用以下代码时出现错误:

 Matcher matcher = pattern.matcher("/Date\(\d+\)/");

错误是:

invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )

我还尝试将括号中的值更改为('/Date\(\d+\)/');没有任何成功。

如何避免此错误?

3 个答案:

答案 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.indexOftextToMatch.contains

答案 2 :(得分:0)

要在java中转义正则表达式,您还可以使用Pattern.quote()