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应用程序中)。我们希望允许用户输入任何数字,字母(我们需要包括带重音的字符,例如法语或德语)和一些特殊字符,例如’-。等等 如何将诸如<>%$等的字符列入黑名单? 问题答案: 我只是将角色列入白名单。 使用正则表达式构建黑名单同样简单,但是你可能需要添加更多字