【问题标题】:Ignore regex when comparing strings [duplicate]比较字符串时忽略正则表达式[重复]
【发布时间】:2012-11-15 05:42:18
【问题描述】:

可能重复:
How to escape text for regular expression in Java

我有一个问题,我的用户有便盆......

详细说明,我的 Android 应用程序使用 Google 语音搜索返回语音结果,如果用户已将设置应用到“阻止冒犯性词语”,它将返回“离开”为“g* a***”

当试图确定用户所说的内容时,我会经常使用常见的匹配,例如:

if(voiceResult.matches(someCommand)) { //do something

如果用户选择说脏话,那么我会收到以下错误:

java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index X

我真的不能要求我的所有用户要么不发誓或关闭过滤器,特别是从我的测试来看,Google 语音搜索似乎有一个肮脏的头脑,并且经常在最随机的中间返回脏话句子!

所以,我对如何处理这种可能性有点迷茫......我一直在寻找一种在字符串中“忽略正则表达式”的方法,但我画了一个空白,我不知道如何我会动态转义字符串中包含的任何 *...

目前,我唯一的选择似乎是检测到“*”,然后很好地要求他们不要发誓或删除过滤器!

欢迎提出建议!除非你认为他们应该因为他们的不礼貌而被强制关闭......

请注意:“走开”目前未被过滤 - 这是一个示例......

编辑:我确认重复语音请求的最简单的正则表达式示例:

String userWords = "g* a***"

if(userWords.matches(userWords)) { // Then go on to compare userWords with other strings

编辑2:

    String goAway = "g* a***";

    String goAway1 = Pattern.quote(goAway);
    String goAway2 = Pattern.quote(goAway);

    if (goAway1.matches(goAway2)) { \\ do something

【问题讨论】:

  • 我有数千个 .matches 和 .contains 所以重写我的代码以获得答案远非理想......
  • 您能发布导致问题的特定正则表达式吗?
  • 好吧,如果您的代码中有数千个地方存在问题并且您需要在每个地方都修复它,您希望解决方案是什么样的?
  • @andjav 您正在使用将正则表达式作为参数的方法(请参阅documentation。没有全局开关显示“请不要使用正则表达式”。所以您要么必须使用一种不同的方法(这仍然需要您更改代码中的每一个用法)或转义您的字符串,以便它们可以用作正则表达式。
  • @andjav 你做myEscapedWords = Pattern.quote(myWords); 它将转义所有正则表达式元字符,允许myEscapedWords 用作匹配文字字符串myWords 的正则表达式。

标签: java android regex


【解决方案1】:

您可以使用Pattern.quote() 为您进行转义,如发现here

String pattern = Pattern.quote("g* a***");

会给你以下字符串:

"g\* a\*\*\*"

请注意,这些反斜杠是字符串中的实际字符。如果你想手动创建这个字符串,你可以使用这个赋值:

String pattern = "g\\* a\\*\\*\\*";

现在您可以使用goAway1 作为正则表达式模式,它与g* away*** 完全匹配(因为每个字符都被视为文字)。所以,例如:

String goAway = "g* a***";
String pattern = Pattern.quote("g* a***");
if (goAway.matches(pattern)) { // we know that goAway was "g* a***"

当然,您不能使用该模式来匹配带引号的字符串(就像您在编辑的代码 sn-p 中所做的那样)。您尝试做的与应用 regex

相同
String pattern = "g\\* a\\*\\*\\*";

到这个literal主题字符串:

String subject = "g\\* a\\*\\*\\*";

会发生什么?模式中的 g 匹配主题中的 g。现在该模式包含一个转义序列\*,它将匹配文字*。但是主题字符串接下来有一个文字\。这不匹配。

【讨论】:

  • 很棒的答案。现在一清二楚!谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 2013-08-13
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
相关资源
最近更新 更多