【问题标题】:Java String#contains() using String#matches() with escape characterJava String#contains() 使用带有转义字符的 String#matches()
【发布时间】:2012-04-01 16:28:50
【问题描述】:

我需要一种简单的方法来使用matches 实现contains 函数。我相信这是我的出发点:

xxx.matches("'.*yyy.*'");

但我需要使它成为一种通用方法并预处理我搜索的任何内容以被匹配项接受!这必须仅使用转义“\”字符来完成!

想象一个字符串 SEARCH_FOR 可以包含一些必须“正则表达式转义”的特殊字符...

String SEARCH_FOR="*.\\"
xxx.matches("'.*" + SEARCH_FOR + ".*'");

有什么问题吗?特殊情况?是否应考虑其他任何“特殊字符”?

【问题讨论】:

  • 为什么不直接使用正确的方法调用?
  • 用 \Q 和 \E 包围 SEARCH_FOR 对你有用吗?他们告诉匹配引擎不要解释某个地区的特价商品。
  • @jackrabbit:如果搜索字符串包含 \E 将无济于事。
  • 呵呵,没想到。 pilaster 的建议是可行的方法。
  • @marcolopes:如果这不是家庭作业,那么让你手动完成的人就是个白痴。有一个专门用来转义正则表达式特殊字符的函数;为什么不能用?

标签: java regex string contains


【解决方案1】:

您在寻找Pattern.quote(String) 吗?

这会为您转义特殊字符。


编辑:

阅读完 cmets 后,我真的希望您尝试 Pattern.quote(yourString.toLowerCase()),因为听起来您一直在使用 Pattern.quote(yourString).toLowerCase()。如果 DataNucleus 正在应用正则表达式,那么使用 \Q\E 转义序列应该没有问题。

既然你真的要求它,".\\".replaceAll("(\\.|\\$|\\+|\\*|\\\\)", "\\\\\$1") 输出\.\\ 这将逃脱.'s$'s、+'s*'s\'s。请注意,这一切的安全性现在都在您身上。如果您没有转义您需要的内容,或者您​​转义不正确,您将允许人们在您不期望的情况下在搜索词中使用正则表达式,或者它不会返回您期望的结果。

【讨论】:

  • @marco:它基本上接受你给它的字符串,并生成一个匹配该字符串的正则表达式。不管它做什么,无论它必须插入什么。可能是反斜杠,可能是括号,无论如何。您真正需要关心的是它是否有效。 :)
  • 我有理由! org.datanucleus.exceptions.NucleusUserException:无效字符转义:'\q'
  • @marco:你在别处破坏了代码,这就是你所拥有的。 Pattern.quote() 不会给你一个带有\q 的正则表达式。您要么在正则化字符串后强制字符串小写(阅读:您的代码已损坏),要么您将其传递给任何内容(阅读:datanucleus 已损坏)。我会假设它是你的代码。
  • 我正在将结果转换为小写...这是我的代码中的一个错误,但无论哪种方式,Pattern.quote(".\\") 都会导致 "\Q.\\E" !!刚刚看到 Pattern.quote 代码,它就是这样做的!我需要“*\.\\”形式的东西...
  • 别忘了,你看到的不是你必须输入的。如果你输入 "\Q.\\E" 作为字符串文字,它会看起来像"\\Q.\\\\E"。 (有两个级别的转义序列……Java 的标准转义,然后是正则表达式所做的转义。)
猜你喜欢
  • 2014-11-29
  • 2017-06-17
  • 2010-09-16
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多