如果用户回答“是”或“否”,我正在遍历语音数据的数组列表来解密。简单嘿......
这是我必须检测到包含“是”和“否”的不明确响应的初步检查。它工作得很完美,但只是看着它,我知道我应该感到尴尬发布它,它可以大大简化!
if ((element.toString().startsWith("yes ")
|| element.toString().endsWith(" yes")
|| element.toString().contains(" yes "))
&& (element.toString().startsWith("no ")
|| element.toString().endsWith(" no")
|| element.toString().contains(" no "))) {
// I heard both yes and no - inform user I don't understand
我希望用户能够接受或拒绝使用他们想要的任何自然语音,因此需要考虑数组数据中出现以下不可能的事件:
我经历了很多正则表达式帖子和教程,但无论我做什么,我都找不到比发布的代码更好的解决方案。白色空间[\\ s]在那里或'|'不,我无法解决......
我事先感谢你的帮助!
答案 0 :(得分:6)
如果您只想要“是”或“否”(即“贝叶斯定理色情”和“昨天”不匹配),那么您可以使用\b
作为正则表达式中的边界字符:Pattern
JavaDoc,Boundaries tutorial
假设你已经低估了输入,那么这应该可行:
Pattern yes = Pattern.compile(".*\\byes\\b.*");
Pattern no = Pattern.compile(".*\\bno\\b.*");
...
bool matchesYes = yes.matcher(input).matches();
bool matchesNo = no.matcher(input).matches();
if (matchesYes == matchesNo) {
... //Do "invalid answer" here -
//we either matched both (true, true) or neither (false, false)
} else if (matchesYes) {
... //Do "Yes" here
} else { //Else matches No
... //Do "No" here
}
测试代码:
private static Pattern yes = Pattern.compile(".*\\byes\\b.*");
private static Pattern no = Pattern.compile(".*\\bno\\b.*");
/**
* @param args
*/
public static void main(String[] args) {
TestMethod("yes"); //Yes
TestMethod("no"); //No
TestMethod("yesterday"); //Bad
TestMethod("fred-no-bob"); //No
TestMethod("fred'no'bob"); //No
TestMethod("fred no bob"); //No
TestMethod("snow"); //Bad
TestMethod("I said yes"); //Yes
TestMethod("yes no"); //Bad
TestMethod("no yes"); //Bad
}
private static void TestMethod(String input) {
System.out.print("Testing '" + input + "': ");
bool matchesYes = yes.matcher(input).matches();
bool matchesNo = no.matcher(input).matches();
if (matchesYes == matchesNo) {
System.out.println("Bad");
} else if (matchesYes) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}