Java startsWith endsWith匹配项包含正则表达式
我正在遍历语音数据的数组列表,以破译用户是否回答“是”或“否”。简单的嘿 这是第一次检查,我必须检测到一个包含“是”和“否”的不清楚响应。它工作得很完美,但只要看看它,我知道我应该不好意思发布它,它可以大大简化Java startsWith endsWith匹配项包含正则表达式,java,android,regex,Java,Android,Regex,我正在遍历语音数据的数组列表,以破译用户是否回答“是”或“否”。简单的嘿 这是第一次检查,我必须检测到一个包含“是”和“否”的不清楚响应。它工作得很完美,但只要看看它,我知道我应该不好意思发布它,它可以大大简化 if ((element.toString().startsWith("yes ") || element.toString().endsWith(" yes") || element.toString().contains(" yes ")) &
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
<>我希望用户能够接受或拒绝使用他们想要的任何自然语言,因此需要考虑数组数据中出现的不可能的事件:
- 是不是
- 赛安
- 是的,敲门
- 昨天没有
- 昨天敲门
- 贝叶斯定理
\b
作为正则表达式中的边界字符:
假设您已经降低了输入的大小写,那么这应该会起作用:
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");
}
}
谢谢你的链接,但我无法想象它会被用来省略周围的字母或空白。请你详细说明一下好吗?编辑-刚刚看到您的更新,现在检查-谢谢
\b
表示“单词边界”,基本上匹配下一个字符不是单词字符的点(\w
),包括行首和行尾,因此“否”、“弗雷德无鲍勃”和“弗雷德无鲍勃”应该匹配,但“弗雷德无鲍勃”不匹配。在类似的地方尝试一下(但是没有转义斜杠-所以在很多regex测试站点上都是\bno\b
)谢谢你的解释和Regextest-我一直在寻找类似的东西!我即将在我的应用程序中进行测试,在我完成测试后,我会回来将答案标记为正确!再次感谢。我不得不改为:patternyes=Pattern.compile(\\byes\\b”);但它不起作用?它在任何地方都检测不到“是”这个词。我现在已经用我能想到的最短版本修复了“是非”问题-创建模式,创建匹配器,检查它们是否匹配字符串,并使用if..else if..else
作为三个条件。执行Matcher noMatcher=no.Matcher(输入)可能会带来一些小的性能好处代码>一次,然后<代码>无匹配器重置(输入)在您执行.matches()
测试之前,不要每次都创建一个新的匹配器,但我不知道有多少。