我有以逗号分隔的正则表达式列表:
.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]
我对逗号做了一个拆分。现在我正在尝试将这个regex与生成的密码匹配。问题是,Pattern.compile不喜欢不转义的方括号。请给我一个简单的函数,它接受这样一个字符串:[0-9]并返回转义字符串\[0-9\]。
出于某种原因,上面的答案对我不起作用。对于像我这样的追随者,这是我发现的。
不过,如果将模式存储在字符串中,则必须使用两个反斜杠。第一个反斜杠将第二个反斜杠转义到字符串中,所以regex看到的是\]。因为regex只看到一个反斜杠,所以它使用它来转义方括号。
\\]
在regex中,这将匹配一个右方括号。
例如,如果您试图匹配换行符,您只需要使用一个反斜杠。您正在使用字符串转义模式向字符串中插入换行符。regex没有看到——它看到了换行符,并与之匹配。您需要两个反斜杠,因为它不是字符串转义序列,而是regex转义序列。
当我思考这个问题时,我想到了为什么是这样的:regex是一个字符串,不管这个regex如何处理,它都会寻找一个单独的backslah作为转义符。然而,当regex作为字符串传递时,为了将其正确地放入字符串中,您还必须对backslah进行转义,这就是readon为什么需要两个反斜杠的原因。
您可以使用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.
你对String投入了什么价值?EDOCX1?1?
@Dannybulls从"一个简单的函数,它接受一个这样的字符串:[0-9],并返回转义的字符串\[0-9\]"。所以你给这个"[0-9]",它会返回相当于"\[0-9\]"的东西。(实际使用\Q和\E,但最终结果与Pattern.compile的效果相同。)
令人惊叹的。感谢您的快速帮助,即使9年后也是如此。)
您可以使用q和e特殊字符…自动转义q和e之间的任何字符。
\Q[0-9]\E
听起来有点流行,如果你问我,你试过Java(我没有,这就是为什么我问)。
它在Java中也是有效的:JavaSun.COM/JavaSe/6/DOCS/API/Java/UTL/ReGEX/Topn.HTML(用于"q"的CTRL F)
在Java字符串文字格式中,它将是"q[09] e"或"q"+正则表达式+"e"。但Quote()方法可以为您做到这一点,而且它可以正确处理已经包含e的字符串。
Pattern.compile()喜欢方括号。如果你拿着绳子
".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"
然后用逗号分隔,最后得到五个完全有效的正则表达式:第一个匹配八个非行分隔符字符,第二个匹配一个ASCII数字,依此类推。除非你真的想匹配像".{8}"和"[0-9]"这样的字符串,否则我不明白你为什么需要逃避任何东西。