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

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

.{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]"这样的字符串,否则我不明白你为什么需要逃避任何东西。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值