【问题标题】:regex: How to escape backslashes and special characters?正则表达式:如何转义反斜杠和特殊字符?
【发布时间】:2016-03-23 15:27:42
【问题描述】:

有没有办法转义(或保护)正则表达式中的特殊字符?

我想做的是创建一个简单的正则表达式测试器:

import java.util.regex.*;
class TestRegex { 
   public static void main( String ... args ) { 
       System.out.printf("%s ~= %s ? %s  %n" , args[0], args[1], Pattern.matches( args[0], args[1] ) );
   }
}

在将模式插入程序之前测试我的模式非常有用:

$java TestRegex "\d" 1
\d ~= 1 ? true  
$java TestRegex "\d" 12
\d ~= 12 ? false  
$java TestRegex "\d+" 12
\d+ ~= 12 ? true  
$java TestRegex "\d+" a12
\d+ ~= a12 ? false  
$java TestRegex "\d+" ""
\d+ ~=  ? false  

接下来我要做的就是在我的程序中使用这个模式,但每次我都必须手动转义它:

Pattern p = Pattern.compile( /*copy pasted regex here */ );

在此示例中,将 \d 替换为 \\d。过了一会儿,这变得非常烦人。

问。如何自动转义这些特殊字符?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您只需将所有单反斜杠替换为双反斜杠即可。这有点复杂,因为 String 上的 replaceAll 函数确实执行正则表达式,您必须首先转义反斜杠,因为它是文字(产生 \\),然后因为正则表达式(产生\\\\)。替换遭受了类似的命运,需要两个这样的转义序列,使其总共有 8 个反斜杠:

    System.out.printf("%s ~= %s ? %s  %n", 
        args[0].replaceAll("\\\\","\\\\\\\\"), args[1], ...
    

    【讨论】:

    • 我得到:Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 pastebin.com/aEWSibXv
    • 像这样的时刻,我希望 Java 对文字字符串有更好的语法。
    • @Oscar:哎呀,您必须为字符串文字转义一次,然后再转义一次,因为replaceAll 本身就是一个正则表达式。现已修复。
    • 我是 \ far.. 我尝试了几种组合 :) 特殊字符怎么样,例如 + { ( 等?我认为我不需要对那些进行 scape 吗?
    • @Oscar:不,唯一会引起问题的文字是反斜杠。具有讽刺意味的是,我犯的错误与您要解决的错误相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2017-05-06
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多