比较字符串时忽略正则表达式

时间:2012-11-27 15:01:03

标签: java android regex

  

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

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

详细说明,我的Android应用程序使用谷歌语音搜索来返回语音结果,如果用户将设置应用于“阻止攻击性词语”,它将返回'离开'为'g * a ***'

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

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

如果用户选择说淫秽,那么我将收到以下错误:

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

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

所以,我对如何应对这种可能性感到有点迷茫...我已经找到了一种方法来“忽略字符串中的正则表达式”,但我画了一个空白,我无法弄清楚如何我会动态地转义字符串中包含的任何* *

目前,我唯一的选择似乎是检测'*'然后请他们不要发誓或删除过滤器!

欢迎提出建议!除非你认为他们应该因为他们的不礼貌而接近一个力量......

请注意:'go away'目前尚未过滤 - 这是一个例子......

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

String userWords = "g* a***"

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

EDIT2:

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

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

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

1 个答案:

答案 0 :(得分: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***"

当然,您无法使用该模式匹配带引号的字符串(就像您在编辑过的代码段中所做的那样)。您要做的与应用正则表达式

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

到此文字主题字符串:

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

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