2013-06-14 2 views
2

Я пытаюсь совместить команду с распознаванием голоса на Android. Признание в порядке, но у меня возникают проблемы с созданием одного из моих шаблонов регулярных выражений (программа использует java.util.regex)предотвращает совпадение регулярных выражений как впереди, так и сзади с поисковыми окнами?

У меня есть команда, которая останавливает мою музыку. Он совпадает с любой секундой остановки или убивает в той же команде, что и слово музыка. Это выглядит следующим образом:

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

не очень красиво, я знаю, но это работает

Моя проблема заключается в том, что я не могу сформулировать противоположное выражение: т.е. спичку термин музыку только если слова остановить или kill не присутствуют нигде в команде. Я смотрел на и пытаясь понять негативные просмотровых обходные но они запутать ад из меня

мне удалось предотвратить матчи с предварительным просмотром, используя что-то вроде этого:

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

Это предотвращает совпадения, когда остановка или убийство появляются после «музыки», но я не могу за всю жизнь понять, как заставить ее работать с негативным взглядом. Я думаю, что, может быть, мои подстановочные знаки на заднем плане все испортили, но я действительно понятия не имею.

Я чувствую себя очень глупо, и любая помощь очень ценится.

ответ

2

Как насчет первой проверки, если команда не содержат stop|kill с отрицательным взглядом, а затем проверяете, имеет ли он music с положительным внешним видом?

^(?!.*(stop|kill))(?=.*music).* 
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.*"))); 
} 
+0

Это значение _insane_ смысла. Я чувствую себя медленно. – Laharah