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
<>我希望用户能够接受或拒绝使用他们想要的任何自然语言,因此需要考虑数组数据中出现的不可能的事件:

  • 是不是
  • 赛安
  • 是的,敲门
  • 昨天没有
  • 昨天敲门
  • 贝叶斯定理
我已经阅读了很多正则表达式的文章和教程,但是无论我做什么,我都找不到比所发布的代码更好的解决方案。空白[\\s]在那里或“|”不在,我无法解决

我提前感谢你的帮助

如果您只想要单词“是”或“否”(即“bayes定理色情”和“昨天”不匹配),则可以使用
\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()
测试之前,不要每次都创建一个新的匹配器,但我不知道有多少。