如何转义模式编译的方括号

时间:2009-07-16 20:58:52

标签: java regex escaping special-characters

我用逗号分隔正则表达式列表:

.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]

我对逗号进行了分割。现在我正在尝试将此正则表达式与生成的密码进行匹配。问题是Pattern.compile不喜欢没有转义的方括号。有些人可以给我一个简单的函数,它接受如下字符串:[0-9]并返回转义字符串\[0-9\]

4 个答案:

答案 0 :(得分:32)

出于某种原因,上述答案对我不起作用。对于像我这样的人来说,这就是我找到的。

我期待一个反斜杠来逃避括号,但是,如果您将模式存储在字符串中,则必须使用两个反斜杠。第一个反斜杠将第二个反斜杠转义为字符串,因此正则表达式看到的是\]。由于正则表达式只看到一个反斜杠,它使用它来逃避方括号。

\\] 

在正则表达式中,这将匹配单个结束方括号。

例如,如果您尝试匹配换行符,则只使用一个反斜杠。您正在使用字符串转义模式在字符串中插入换行符。正则表达式没有看到\n - 它看到换行符,并匹配它。你需要两个反斜杠,因为它不是一个字符串转义序列,它是一个正则表达式转义序列。

答案 1 :(得分:23)

您可以使用Pattern.quote(String)

来自文档:

  

public static String quote​(String s)

     

返回指定String的文字模式String

     

此方法生成一个String,可用于创建一个与字符串s匹配的Pattern,就像它是一个文字模式一样。

     

输入序列中的元字符或转义序列没有特殊含义。

答案 2 :(得分:12)

您可以使用\ Q和\ E特殊字符... \ Q和\ E之间的任何内容都会自动转义。

\Q[0-9]\E

答案 3 :(得分:3)

Pattern.compile()喜欢方括号。如果你拿字符串

".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"

并将其拆分为逗号,最终得到五个完全有效的正则表达式:第一个匹配八个非行分隔符,第二个匹配ASCII数字,依此类推。除非你真的想要匹配".{8}""[0-9]"之类的字符串,否则我不明白为什么你需要逃避任何事情。