我正在尝试通过Android上的语音识别来匹配命令。识别很好但是我在制作我的一个正则表达式模式时遇到了麻烦(程序使用java.util.regex)
我有一个停止音乐的命令。它匹配任何时候停止或杀死与音乐一词在同一命令中。它看起来像这样:
((stop|kill).*music)|(music.*(stop|kill))
不是很漂亮,我知道,但它有效
我的问题是我无法表达相反的表达式:即只有在命令中任何地方都没有单词stop或kill时才匹配术语音乐。我一直在寻找和试图理解消极的情绪,但他们让我感到困惑
我已设法使用以下内容防止匹配:
music(?!.*(stop|kill))
这可以防止在“音乐”之后停止或杀死时出现的匹配,但我不能在我的生活中弄清楚如何让它以负面的后视效果工作。我想也许我背后的通配符会弄乱一切,但我真的不知道。
我感觉非常愚蠢,非常感谢任何帮助。
答案 0 :(得分:2)
首先检查命令是否包含带有否定前瞻的stop|kill
,然后检查它是否有music
具有正面预测?
^(?!.*(stop|kill))(?=.*music).*
答案 1 :(得分:1)
如果没有后视,您可以使用此正则表达式匹配music
但没有stop
/ kill
的任何内容:
(?!.*(stop|kill)).*music.*
结果:
"stop music" -> matches() == false
"music stop" -> matches() == false
"music go" -> matches() == true
"go music" -> matches() == true
"music go stop" -> matches() == false
使用的采样代码:
String[] words = {"stop music", "music stop", "music go", "go music", "music go stop" };
for (String word : words) {
System.out.println("\""+word+"\" -> matches() == "+(word.matches("(?!.*(stop|kill)).*music.*")));
}