我试图达到这样的结果:如果用户输入单词,复数或单数,正则表达式应该返回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)
}
非常感谢您在这个问题上的宝贵时间。
答案 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;
}
}
非常简单而且不太实用,但只需要几句话即可完成工作。