1

可能重复:
如何在 Java 中为正则表达式转义文本

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

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

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

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

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

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

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

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

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

欢迎提出建议!除非你认为他们应该因为他们的不礼貌而被逼近……

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

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

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
4

1 回答 1

1

您可以使用Pattern.quote()为您进行转义,如此所示。

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主题。现在该模式包含一个转义序列\*,它将匹配一个文字*。但是主题字符串\接下来有一个文字。这不匹配。

于 2012-11-27T16:13:41.333 回答