33

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

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

我已经对逗号进行了拆分。现在我正在尝试将此正则表达式与生成的密码进行匹配。问题是Pattern.compile不喜欢没有转义的方括号

有人可以给我一个简单的函数,它接受这样的字符串:[0-9]并返回转义的字符串\[0-9\]

4

4 回答 4

48

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

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

\\] 

在正则表达式中,这将匹配一个右方括号。

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

于 2015-07-29T04:50:51.843 回答
28

您可以使用Pattern.quote(String).

从文档:

public static String quote​(String s)

String返回指定的文字模式String

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

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

于 2009-07-16T21:03:38.800 回答
15

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

\Q[0-9]\E
于 2009-07-16T21:06:11.870 回答
3

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

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

并用逗号分割,你最终得到五个完全有效的正则表达式:第一个匹配八个非行分隔符,第二个匹配一个 ASCII 数字,依此类推。除非你真的想匹配像".{8}"and这样的字符串"[0-9]",否则我不明白你为什么需要转义任何东西。

于 2009-07-18T08:27:12.787 回答