我有一个问题,我的用户有便盆口....
详细说明,我的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
答案 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
。现在,模式包含一个与文字\*
匹配的转义序列*
。但是主题字符串接下来有一个文字\
。这无法匹配。