当前位置: 首页 > 知识库问答 >
问题:

Java正则表达式中的转义特殊字符

缪成天
2023-03-14

Java 或任何开源库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式?

这在动态构建正则表达式时非常方便,而无需手动转义每个单独的字符。

例如,考虑一个简单的正则表达式,如 \d \.\d,它匹配小数点(如 1.2)的数字,以及以下代码:

String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");

Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);

System.out.println("Regex 1: " + regex1);

if (numbers1.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}

System.out.println("Regex 2: " + regex2);

if (numbers2.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}

毫不奇怪,上述代码产生的输出是:

Regex 1: \d+\.\d+
    Match
Regex 2: \Qd+.d+\E
    No match

也就是说,regex1匹配1.2regex2(它是“动态”构建的)不匹配(相反,它匹配文字字符串d. d)。

那么,有没有一种方法可以自动转义每个正则表达式元字符?

假设在java.util.regex.Pattern中有一个静态escape()方法,则输出

Pattern.escape('.')

将是字符串"\.",但是

Pattern.escape(',')

应该只生成",",因为它不是元字符。同样,

Pattern.escape('d')

可能会产生“\d”,因为'd'用于表示数字(尽管在这种情况下转义可能没有意义,因为'd'd',这不会被正则表达式插入器误解为其他东西,就像'.'的情况一样)。

共有3个答案

通典
2023-03-14

正则表达式匹配器知道您正在寻找数字而不是字母 d 的唯一方法是转义字母 (\d)。要在 java 中键入正则表达式转义字符,您需要对其进行转义(因此 \ 变为 \\)。因此,没有办法为特殊的正则表达式字符键入双反斜杠。

华阳秋
2023-03-14

我写了这样的模式:

Pattern SPECIAL_REGEX_CHARS = Pattern.compile("[{}()\\[\\].+*?^$\\\\|]");

并在此方法中使用它:

String escapeSpecialRegexChars(String str) {

    return SPECIAL_REGEX_CHARS.matcher(str).replaceAll("\\\\$0");
}

然后您可以这样使用它,例如:

Pattern toSafePattern(String text)
{
    return Pattern.compile(".*" + escapeSpecialRegexChars(text) + ".*");
}

我们需要这样做,因为在转义之后,我们添加了一些正则表达式。如果没有,您可以简单地使用< code>\Q和< code>\E:

Pattern toSafePattern(String text)
{
    return Pattern.compile(".*\\Q" + text + "\\E.*")
}
钱远
2023-03-14

Java 或任何开源库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式?

如果您正在寻找一种创建可以在正则表达式模式中使用的常量的方法,那么只需在它们前面加上“\\”应该可以工作,但没有很好的 Pattern.escape('.') 函数来帮助解决这个问题。

因此,如果您试图匹配< code>"\\d"(字符串< code>\d而不是十进制字符),那么您应该:

// this will match on \d as opposed to a decimal character
String matchBackslashD = "\\\\d";
// as opposed to
String matchDecimalDigit = "\\d";

Java字符串中的4个斜杠在regex模式中变成了2个斜杠。正则表达式模式中的2个反斜杠匹配反斜杠本身。在任何特殊字符前加上反斜杠会将其转换为普通字符,而不是特殊字符。

matchPeriod = "\\.";
matchPlus = "\\+";
matchParens = "\\(\\)";
... 

在您的帖子中,您使用<code>模式。quote(字符串)方法。此方法将模式包装在“\\Q”“\\E”之间,这样即使字符串中恰好有一个特殊的正则表达式字符,您也可以匹配它( \\d

 类似资料:
  • 问题内容: Java或任何开放源代码库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式? 动态构建正则表达式非常方便,而不必手动转义每个字符。 例如,考虑一个简单的正则表达式,它匹配带小数点的数字,例如,以及以下代码: 毫不奇怪,以上代码产生的输出是: 也就是说,匹配项(但是“动态”构建的)不匹配(相反,它与文字字符串匹配)。 那么,有没有一种方法可以自动转义每个正则表

  • 问题内容: 我正在尝试用比Java regex语法更简单的通配符来匹配用户输入。假设有一个通配符A。然后,用户将输入输入字符串: 并将“ test”与搜索字符串匹配: 为此,我将搜索字符串中的通配符字符串替换为,因此我可以将通配符与常规正则表达式的捕获组进行匹配。但是,我仍然希望转义特殊字符。如果我使用引号,则正则表达式将不再起作用,因为带有正则表达式含义的字符()也被引用了: 是否有一种内置的方

  • 问题内容: 我正在尝试创建一个应用程序,该应用程序将消息模板与用户尝试发送的消息进行匹配。我正在使用Java正则表达式来匹配消息。模板/消息可能包含特殊字符。 我如何获取需要转义的特殊字符的完整列表,以使我的正则表达式在最大可能的情况下起作用并匹配? 是否存在通用的解决方案,可以在Java正则表达式中转义所有特殊字符? 问题答案: 你可以查看Pattern类的javadoc:http : //do

  • 问题内容: 我很难提出一个正则表达式,该正则表达式实际上会将某些特殊字符列入黑名单。 我需要使用它来验证输入字段中的数据(在Java Web应用程序中)。我们希望允许用户输入任何数字,字母(我们需要包括带重音的字符,例如法语或德语)和一些特殊字符,例如’-。等等 如何将诸如<>%$等的字符列入黑名单? 问题答案: 我只是将角色列入白名单。 使用正则表达式构建黑名单同样简单,但是你可能需要添加更多字

  • 我试图为密码字段创建一个验证,它只允许字符和 时有什么区别,以及哪些字符来自

  • 问题内容: 我厌倦了总是试图猜测,()[]{}|在使用许多正则表达式实现时是否应该转义’ ‘等特殊字符。 它与Python,sed,grep,awk,Perl,重命名,Apache,find等不同。是否有任何规则集可以告诉我何时以及何时不应该转义特殊字符?它是否取决于正则表达式类型,例如PCRE,POSIX或扩展正则表达式? 问题答案: 实际上,您必须转义哪些字符以及您必须避免转义哪些字符确实取决