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

在Java正则表达式中转义特殊字符(不引用)

麹培
2023-03-14
问题内容

我正在尝试用比Java regex语法更简单的通配符来匹配用户输入。假设有一个通配符A。然后,用户将输入输入字符串

this ( is \ a $ test.

并将“ test”与搜索字符串匹配:

this ( is \ a $ %A%.

为此,我将搜索字符串中的通配符字符串替换为(.+?),因此我可以将通配符与常规正则表达式的捕获组进行匹配。但是,我仍然希望转义特殊字符。如果我使用引号,则正则表达式将不再起作用,因为带有正则表达式含义的字符((.+?))也被引用了:

String inputString  = "this ( is \\ a $ test."
String searchString = "this ( is \\ a $ %A%."
String regex = Pattern.quote(searchString); 
//regex = "\\Qthis ( is \\ a $ %A%.\\E"
regex = regex.replaceFirst("%A%", "(.+?)");   
//regex = "\\Qthis ( is \\ a $ (.+?).\\E"
Matcher matcher = Pattern.compile(regex).matcher(inputString); //no match

是否有一种内置的方法可以真正转义特殊字符,而不是引用整个字符串?


问题答案:

您需要找到%A%,用引号括住,用引号括起来,然后用匹配的regex语法替换。

我不确定此通配符的全部要求是什么,但是如果只能%A%,它将看起来像这样:

String searchString = "this ( is \\ a $ %A%.";
String extractorToken = "(.+?)";

int indexOfWildcard = searchString.indexOf("%A%");
String pattern = Pattern.quote(searchString.substring(0, indexOfWildcard)) +
                 extractorToken +
                 Pattern.quote(searchString.substring(indexOfWildcard + 3, searchString.length()));
Matcher matcher = Pattern.compile(pattern).matcher(inputString);

如果通配符可以具有不同的形式,则可以改用正则表达式来定位通配符的位置,然后执行上述操作。



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

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

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

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

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

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