如果用户只能输入单个字符串搜索词以按名称查找用户,并且用户将名称存储为名字和姓氏字符串,那么我想使用输入字符串按名字,姓氏进行搜索, 或两者。
虽然可以有条件地分割输入,然后将第一个和第二个字符串与名字和姓氏相匹配,但那里有很多逻辑,我想知道是否有更简洁的方法来转动整个字符串进入匹配
的正则表达式模式例如:
如果用户输入“John Doe”,我希望它能够检索名字为“John”或“Doe”,姓氏为“John”或“Doe”以及“John Doe”的用户。我希望“John”也能返回名字为“John”的用户。我正在寻找最有效的方法,最好不要将输入字符串拆分为任何可能的空格。
final String searchTerm = "John Doe";
pattern = Pattern.compile(/* some regex pattern */, Pattern.CASE_INSENSITIVE);
results = usersCollection.find(new BasicDBObject("$or", new BasicDBList() {
{
add(new BasicDBObject("firstName", pattern));
add(new BasicDBObject("lastName", pattern));
}
})
);
没有整个搜索词的简单正则表达式模式,我必须
final String searchTerm = "John Doe";
String[] parts = searchTerm.split(" ");
firstPattern = Pattern.compile(parts[0], Pattern.CASE_INSENSITIVE);
secondPattern = Pattern.compile(parts[1], Pattern.CASE_INSENSITIVE);
results = usersCollection.find(new BasicDBObject("$or", new BasicDBList() {
{
add(new BasicDBObject("firstName", firstPattern));
add(new BasicDBObject("lastName", secondPattern));
/*AND*/
add(new BasicDBObject("firstName", secondPattern));
add(new BasicDBObject("lastName", firstPattern));
}
})
);
并且还需要条件逻辑来检测单个名称的字符串,如“John”,以消除拆分并将名字和姓氏与单个字符串进行比较。这一切都非常繁琐,如果可以使用单一的正则表达式,那将是更好的选择。
答案 0 :(得分:1)
尝试replaceAll
空格(\s
)进行正则表达式或签名(|
)。现在你可以简单地使用这种模式。
String test = "John Doe";
String regex = test.replaceAll("\\s", "|");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("John");
System.out.println(matcher.find());
System.out.println(matcher.start());
matcher = pattern.matcher("xJohn");
System.out.println(matcher.find());
System.out.println(matcher.start());
如果您想在搜索 John 时不匹配 xJohn ,请更改:
String regex = "^" + test.replaceAll("\\s", "|") +"$";