【问题标题】:How to escape a square bracket for Pattern compilation?如何为模式编译转义方括号?
【发布时间】:2009-07-16 20:58:51
【问题描述】:

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

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

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

请给我一个简单的函数,它接受如下字符串:[0-9] 并返回转义字符串 \[0-9\]

【问题讨论】:

    标签: java regex escaping special-characters


    【解决方案1】:

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

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

    \\] 
    

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

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

    【讨论】:

    • 当我想到它时,我想出了为什么会这样:正则表达式是一个字符串,无论处理这个正则表达式都会寻找一个反斜杠作为转义字符。但是,由于正则表达式作为字符串传递,您还必须转义反斜杠才能正确地将其转换为字符串,这就是为什么您需要两个反斜杠的原因
    【解决方案2】:

    您可以使用Pattern.quote(String)

    来自文档:

    public static String quote​(String s)

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

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

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

    【讨论】:

    • 您为String 赋予了什么价值? Pattern.quote("\[0-9\]")?
    • @DannyBullis 来自问题“一个简单的函数,它接受如下字符串:[0-9] 并返回转义字符串 \[0-9\]”。所以你会给这个"[0-9]",它会返回相当于"\[0-9\]"的东西。 (它实际上使用了\Q\E,但最终结果与Pattern.compile 相同。)
    • 太棒了。感谢您的快速帮助,即使是 9 年后 :)
    【解决方案3】:

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

    \Q[0-9]\E
    

    【讨论】:

    • 如果你问我,听起来有点失败,你有没有在 java 中尝试过(我没有,这就是我问的原因)。
    • 在 Java 中也有效:java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html (ctrl-F for "\Q")
    • 在 Java 字符串文字格式中,它将是 "\\Q[0-9]\\E" 或 "\\Q" + regex + "\\E"。但是 quote() 方法会为你做这件事,而且它可以正确处理已经包含 \E 的字符串。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多