模式编译时如何转义方括号?

问题描述 投票:0回答:4

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

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

我在逗号上做了split。现在我尝试将此正则表达式与生成的密码进行匹配。问题是

Pattern.compile
不喜欢未转义的方括号

有人可以给我一个简单的函数,它接受这样的字符串:

[0-9]
并返回转义字符串
\[0-9\]

java regex escaping special-characters
4个回答
52
投票

我原本希望用一个反斜杠来转义括号,但是,如果您将模式存储在字符串中,则必须使用两个反斜杠。第一个反斜杠将第二个反斜杠转义到字符串中,因此正则表达式看到的是

\]
。由于正则表达式只看到一个反斜杠,因此它使用它来转义方括号。

\\] 

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

例如,如果您尝试匹配换行符,则只需使用一个反斜杠。您正在使用字符串转义模式将换行符插入到字符串中。正则表达式看不到

\n
- 它看到换行符并与之匹配。您需要两个反斜杠,因为它不是字符串转义序列,而是正则表达式转义序列。


30
投票

您可以使用

Pattern.quote(String)

来自文档:

public static String quote​(String s)

返回指定

String
的文字模式
String

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

输入序列中的元字符或转义序列不会被赋予特殊含义。


15
投票

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

\Q[0-9]\E

3
投票

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

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

并用逗号分隔,您最终会得到五个完全有效的正则表达式:第一个匹配八个非行分隔符,第二个匹配 ASCII 数字,依此类推。除非您真的想匹配像

".{8}"
"[0-9]"
这样的字符串,否则我不明白为什么您需要转义任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.