2

我正在尝试通过 android 上的语音识别来匹配命令。识别很好,但我在制作我的一种正则表达式模式时遇到了麻烦(该程序使用 java.util.regex)

我有一个命令可以停止我的音乐。它匹配任何时候停止或杀死与音乐一词相同的命令。它看起来像这样:

((stop|kill).*music)|(music.*(stop|kill))

不是很漂亮,我知道,但它有效

我的问题是我无法制定相反的表达方式:仅当命令中的任何地方都不存在单词 stop 或 kill 时才匹配术语 music。我一直在寻找并试图理解负面的环顾四周,但它们让我很困惑

我已经设法使用这样的方法防止与前瞻匹配:

music(?!.*(stop|kill))

这可以防止在“音乐”之后出现 stop 或 kill 时出现匹配,但我一生都无法弄清楚如何让它在消极的后视下工作。我想也许我后面的通配符把一切都搞砸了,但我真的不知道。

我感到非常愚蠢,非常感谢任何帮助。

4

2 回答 2

2

如何首先检查命令是否不包含stop|kill负前瞻,然后检查它是否music具有正前瞻?

^(?!.*(stop|kill))(?=.*music).*
于 2013-06-14T22:21:39.517 回答
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.*")));   
}
于 2013-06-14T22:20:12.783 回答