在正则表达式处理过程中,包含字符 {
或 }
的字符串似乎会被拒绝。我可以理解这些是保留字符,需要转义,所以如果我这样做:
string.replaceAll("\\" + pattern);
这个代码可以正常工作,其中pattern
是以{
开头的任何字符串。
问题:有没有一种方法可以自动处理包含这些元字符的字符串,以避免这样的问题?对我来说,它应该与在字符串字面上添加双引号与接受已经具有双引号的输入字符串相同。
Pattern.quote(String)
函数:
public static String quote(String s)
Returns a literal pattern
String
for the specifiedString
.This method produces a
String
that can be used to create aPattern
that would match the strings
as if it were a literal pattern.Metacharacters or escape sequences in the input sequence will be given no special meaning.
Parameters:
s
- The string to be literalized
Returns:
A literal string replacement
Since:
1.5
您可以使用
java.util.regex.Pattern.quote(java.lang.String)
简述:
replaceAll
或replaceFirst
,target/replacement
对作为字面量处理,请使用replace
(它还会替换所有目标出现的地方)。 大多数人对String类中的替换方法的不幸命名感到困惑,这些方法是:
replaceAll(String, String)
replaceFirst(String, String)
replace(CharSequence, CharSequence)
replace(char, char)
由于replaceAll
方法明确声明它替换了所有可能的目标,因此人们认为replace
方法不保证这样的行为,因为它不包含All
后缀。
但是这种假设是错误的。
这些方法之间的主要区别在下表中显示:
╔═════════════════════╦═══════════════════════════════════════════════════════════════════╗
║ ║ replaced targets ║
║ ╠════════════════════════════════════╦══════════════════════════════╣
║ ║ ALL found ║ ONLY FIRST found ║
╠══════╦══════════════╬════════════════════════════════════╬══════════════════════════════╣
║ ║ supported ║ replaceAll(String, String) ║ replaceFirst(String, String) ║
║regex ╠══════════════╬════════════════════════════════════╬══════════════════════════════╣
║syntax║ not ║ replace(CharSequence, CharSequence)║ \/ ║
║ ║ supported ║ replace(char, char) ║ /\ ║
╚══════╩══════════════╩════════════════════════════════════╩══════════════════════════════╝
target
和replacement
视为文字。因此,代替 replaceAll(regex, replacement)
使用 replace(literal, replacement)
。replace
有两个重载版本。它们都适用于您,因为它们不支持正则表达式语法。它们之间的主要区别是:replace(char target, char replacement)
简单地创建一个新字符串,并填充原始字符串中的字符或您决定作为替换的字符(取决于它是否等于目标字符)。
- replace(CharSequence target, CharSequence replacement)
本质上相当于replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement.toString())
,这意味着它与replaceAll
相同(这意味着它在内部使用正则表达式引擎),但它自动为我们转义了target
和replacement
中使用的正则表达式元字符。您不需要任何额外的代码,只需使用\Q
和\E
结构即可,这些结构在Java的Pattern类中有详细说明。
例如,在以下代码中:
String foobar = "crazyPassword=f()ob@r{}+";
Pattern regex = Pattern.compile("\\Q" + foobar "\\E");
该模式将被编译,foobar的特殊字符不会被解释为正则表达式字符。请查看演示此处。
它唯一无法匹配的是输入包含文字\E
的情况。如果您也需要解决这个问题,请在评论中告诉我,我会编辑并添加相应内容。
replace
而不是replaceAll
。 - Pshemoreplace(char, char)
和replace(String, String)
两种方法都可以满足你的需求。 - Pshemo