关于java:如何转义模式编译的方括号

How to escape a square bracket for Pattern compilation

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

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

我对逗号做了一个拆分。现在我正在尝试将这个regex与生成的密码匹配。问题是,Pattern.compile不喜欢不转义的方括号。请给我一个简单的函数,它接受这样一个字符串:[0-9]并返回转义字符串\[0-9\]


出于某种原因,上面的答案对我不起作用。对于像我这样的追随者,这是我发现的。

不过,如果将模式存储在字符串中,则必须使用两个反斜杠。第一个反斜杠将第二个反斜杠转义到字符串中,所以regex看到的是\]。因为regex只看到一个反斜杠,所以它使用它来转义方括号。

1
\\]

在regex中,这将匹配一个右方括号。

例如,如果您试图匹配换行符,您只需要使用一个反斜杠。您正在使用字符串转义模式向字符串中插入换行符。regex没有看到
——它看到了换行符,并与之匹配。您需要两个反斜杠,因为它不是字符串转义序列,而是regex转义序列。


您可以使用Pattern.quote(String)

来自文档:

public static String quote?(String s)

Returns a literal pattern String for the specified String.

This method produces a String that can be used to create a Pattern that would match the string s as if it were a literal pattern.

Metacharacters or escape sequences in the input sequence will be given no special meaning.


您可以使用q和e特殊字符…自动转义q和e之间的任何字符。

1
\Q[0-9]\E


Pattern.compile()喜欢方括号。如果你拿着绳子

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

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