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

Dro*_*Bot 3 java regex android

我编写了匹配filepath的代码,它有扩展名.ncx,

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

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

The*_*ter 5

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

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


Ala*_*ore 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));
}
Run Code Online (Sandbox Code Playgroud)

输出:

The filename is 'sample.ncx'
Run Code Online (Sandbox Code Playgroud)

$ 将匹配锚定到字符串的末尾(或以多行模式结束到行的末尾).它属于正则表达式的末尾,而不是开头.

[/\\\\]是一个匹配正斜杠或反斜杠的字符类.反斜杠必须进行双重转义,因为它在正则表达式和字符串文字中都有特殊含义.正斜杠并没有要求逃跑.

[a-zA-Z0-9_]+匹配一个或多个列出的字符; 没有加号,你只匹配一个.

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

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