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

Afa*_*mee 26 java regex escaping special-characters

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

.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]
Run Code Online (Sandbox Code Playgroud)

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

Cul*_*lub 34

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

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

\\] 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在考虑它时,我想出了为什么会这样:正则表达式是一个字符串,这个正则表达式会将单个backslah作为转义字符.然而,当正则表达式作为String传递时,你必须转义backslah以便将它正确地转换为String,这就是为什么你需要两个反斜杠 (5认同)

Lau*_*ves 24

你可以用Pattern.quote(String).

来自文档:

public static String quote?(String s)

返回String指定的文字模式String.

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

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

  • @DannyBullis 从问题“一个简单的函数,它接受一个像这样的字符串:`[0-9]` 并返回转义字符串 `\[0-9\]`”。所以你给这个 `"[0-9]"`,它会返回等价于 `"\[0-9\]"` 的东西。(它实际上使用了 `\Q` 和 `\E`,但最终的结果在赋予 `Pattern.compile` 时具有相同的效果。) (2认同)

Dan*_*een 13

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

\Q[0-9]\E
Run Code Online (Sandbox Code Playgroud)

  • 在Java字符串文字格式中,它将是"\\ Q [0-9] \\ E"或"\\ Q"+正则表达式+"\\ E".但是quote()方法为你做了这个,而且它正确地处理了已经有\ E的字符串. (6认同)
  • 它在Java中也有效:http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html(ctrl -F表示"\ Q") (2认同)