“无效的转义序列(有效转义序列是\ b \ t \ n \ f \ r \”\'\\)“语法错误

时间:2011-02-11 04:55:21

标签: java android regex

我编写了匹配文件路径的代码,它具有扩展名.ncx,

 pattern = Pattern.compile("$(\\|\/)[a-zA-Z0-9_]/.ncx");
 Matcher matcher = pattern.mather("\sample.ncx");

这显示了一个无效的转义序列(有效的转义序列是\ b \ t \ n \ f \ r \“\'\)语法错误模式。我该如何修复它。

3 个答案:

答案 0 :(得分:5)

在java \中是一个用于转义的保留字符。所以你需要逃避\

pattern=Pattern.compile("$(\\\\|\\/)[a-zA-Z0-9_]/.ncx");

答案 1 :(得分:5)

Pattern p = Pattern.compile("[/\\\\]([a-zA-Z0-9_]+\\.ncx)$");
Matcher m = p.matcher("\\sample.ncx");
if (m.find())
{
  System.out.printf("The filename is '%s'%n", m.group(1));
}

输出:

The filename is 'sample.ncx'

$ anchors匹配字符串的结尾(或多行模式中的行尾)。它属于正则表达式的 end ,而不是开头。

[/\\\\]character class,匹配正斜杠或反斜杠。反斜杠必须进行双重转义,因为它在正则表达式和字符串文字中都有特殊含义。正斜杠需要转义。

[a-zA-Z0-9_]+匹配列出字符的一个或多个;没有plus sign,您只匹配一个

你的正则表达式中的第二个正斜杠是没有意义的,但你确实需要一个反斜杠来逃避dot - 当然,必须为Java字符串文字转义反斜杠。

因为我从alternation|)切换到前导斜杠的字符类,所以不再需要正则表达式中的括号。相反,我使用它们来capture实际的文件名,只是为了演示如何完成。

答案 2 :(得分:2)

试试这个

$(\\|\\/)[a-zA-Z0-9_]/.ncx