防止正则表达式前后匹配与外观?

时间:2013-06-14 22:13:22

标签: java regex regex-lookarounds

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

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

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

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

我的问题是我无法表达相反的表达式:只有在命令中任何地方都没有单词stop或kill时才匹配术语音乐。我一直在寻找和试图理解消极的情绪,但他们让我感到困惑

我已设法使用以下内容防止匹配:

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

这可以防止在“音乐”之后停止或杀死时出现的匹配,但我不能在我的生活中弄清楚如何让它以负面的后视效果工作。我想也许我背后的通配符会弄乱一切,但我真的不知道。

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

2 个答案:

答案 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.*")));   
}