当前位置: 首页 > 面试题库 >

在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.2但是regex2“动态”构建的)不匹配(相反,它与文字字符串匹配d+.d+)。

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

假设存在的静态escape()方法java.util.regex.Pattern

Pattern.escape('.')

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

Pattern.escape(',')

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

Pattern.escape('d')

可能会产生"\d",因为'd'用来表示数字(尽管转义在这种情况下可能没有意义,因为'd'可能意味着literal
'd',正则表达式插入符不会误认为它是别的东西,例如'.')。


问题答案:

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

如果您正在寻找一种创建可在正则表达式模式中使用的常量的方法,则只需在它们前面加上前缀即可,"\\"但是没有很好的Pattern.escape('.')函数可以帮助您。

因此,如果您尝试匹配"\\d"(字符串\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 = "\\(\\)";
...

在您的帖子中,您可以使用Pattern.quote(string)方法。此方法包装之间的模式"\\Q",并"\\E"因此即使它恰好有一个特殊的正则表达式字符它,你可以匹配的字符串(+.\\d等)



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

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

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

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

  • 问题内容: 当匹配某些字符(例如换行符)时,可以使用正则表达式“ \\ n”或仅使用“ \ n”。例如,以下将字符串拆分为行数组: 但是以下内容同样适用: 我的问题: 上面两个是 完全 一样地工作,还是有细微的差别?如果是后者,能否举个例子,说明您得到不同的结果? 还是仅在[可能/理论]表现上有所不同? 问题答案: 在当前情况下没有区别。通常的字符串转义序列是在单个反斜杠的帮助下形成的,然后有效的

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