使用全名作为Java正则表达式模式来匹配名字或姓氏

时间:2014-07-23 20:14:55

标签: java regex

如果用户只能输入单个字符串搜索词以按名称查找用户,并且用户将名称存储为名字和姓氏字符串,那么我想使用输入字符串按名字,姓氏进行搜索, 或两者。

虽然可以有条件地分割输入,然后将第一个和第二个字符串与名字和姓氏相匹配,但那里有很多逻辑,我想知道是否有更简洁的方法来转动整个字符串进入匹配

的正则表达式模式

例如:

如果用户输入“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”,以消除拆分并将名字和姓氏与单个字符串进行比较。这一切都非常繁琐,如果可以使用单一的正则表达式,那将是更好的选择。

1 个答案:

答案 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", "|") +"$";