如果单词是Singular或Plural Java,则搜索true

时间:2017-07-25 12:06:49

标签: java regex

我试图达到这样的结果:如果用户输入单词,复数或单数,正则表达式应该返回true

例如'我想通过无人机'或者'我想通过无人机'。

    @Test
    public void testProductSearchRegexp() {
        String regexp = "(?i).*?\\b%s\\b.*?";

        String query = "I want the drone with FLIR Duo";

        String data1 = "drone";
        String data2 = "FLIR Duo";
        String data3 = "FLIR";
        String data4 = "drones";

        boolean isData1 = query.matches(String.format(regexp, data1));
        boolean isData2 = query.matches(String.format(regexp, data2));
        boolean isData3 = query.matches(String.format(regexp, data3));
        boolean isData4 = query.matches(String.format(regexp, data4));

        assertTrue(isData1);
        assertTrue(isData2);
        assertTrue(isData3);
        assertTrue(isData4);//Test fails here (obviously) 
    }

非常感谢您在这个问题上的宝贵时间。

2 个答案:

答案 0 :(得分:2)

英语是一种有很多例外的语言。检查单词是否以's'结尾仅仅不足以确定它是否为复数。

解决此问题的最佳方法是不解决此问题。它之前已经完成了。利用这一点。一种解决方案是使用第三方API。例如The OED have one

如果您要向其API发出请求,例如:

/entries/en/mice

您将收到包含以下内容的JSON响应:

"crossReferenceMarkers": [
    "plural form of mouse"
],

从那里它应该很容易解析。只需检查“复数”这个词的存在就足够了。

他们甚至可以使用可以复制和粘贴的Java示例。

这种方法的一个优点是没有编译时依赖性。缺点是您依赖于能够发出HTTP请求。另一个原因是你受到任何限制所限制。 OED允许每月最多3k个请求和60个请求/分钟的免费计划,这对我来说似乎很合理。

答案 1 :(得分:0)

如果没有外部资源,很难实现这样的事情。当然,很多单词都以复数形式出现在' s'但也有很多例外,例如" knife"和"刀"或者"仙人掌"和" cacti"。为此,您可以使用地图对这些进行排序。

public static String getPlural(String singular){
    String plural;
    HashMap<String,String> irregularPlurals = new HashMap<>();
    irregularPlurals.put("cactus","cacti");
    irregularPlurals.put("knife","knives");
    irregularPlurals.put("man","men");
    /*add all your irregular ones*/
    plural = irregularPlurals.get(singular);
    if (plural == null){
        return singular + "s";
    }else{
        return plural;
    }
}

非常简单而且不太实用,但只需要几句话即可完成工作。