为了账号安全,请及时绑定邮箱和手机立即绑定

Java 如何使用通配符搜索模式?

Java 如何使用通配符搜索模式?

MMTTMM 2021-09-29 13:09:51
我有 Java 问题。有一个 Web 应用程序,它具有在后端运行 Javascript 和 Java 的搜索功能。我们只能配置 Java 源代码,不能配置 Javascript。问题是有一个ArrayList<UserDTO>. 每个UserDTO包含Id,FirstName,LastName,和email。当我*在搜索引擎中输入时,所有的结果都List出现了。问题出在电子邮件上。如果我搜索一个名字或姓氏,则没有问题。当我搜索一封电子邮件时,没有任何效果。它只有在我搜索这样的内容时才有效:fe 电子邮件是 gchat@mail.com,如果我输入,* gchat@mail *我就会找到它。如果我输入.,在那之后,什么都不起作用。另外,如果我不输入*,则没有任何效果。fe 如果我只输入这样的电子邮件:gchat@mail没有任何效果。这个的源代码是:public ResponseEntity<List<UserDTO>> search(@PathVariable("query") String query) {        List<UserDTO> results = new ArrayList<>();        if (query != null && !query.trim().isEmpty()) {            for (UserDTO user : USERS) {                String regExp = "^" + query.trim().replace("*", ".*") + "$";                Pattern pattern = Pattern.compile(regExp, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);                Matcher firstnameMatcher = pattern.matcher(user.getFirstName());                Matcher lastnameMatcher = pattern.matcher(user.getLastName());                Matcher emailMatcher = pattern.matcher(user.getEmail());                if (firstnameMatcher.matches() || lastnameMatcher.matches() || emailMatcher.matches()) {                    results.add(user);                }            }        }清单是这样的:private static final List<UserDTO> USERS = new ArrayList<>();    static {        USERS.add(new UserDTO("jpap", "John", "Papadopoulos", "jpap@mail.com", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("kpav", "Konstantinos", "Pavlopoulos", "kpav@mail.com", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("echar", "Eleni", "Charalampous", "echar@mail.com", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("gchat", "Georgia", "Chatzipavlou", "gchat@mail.com", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("avel", "Apostolos", "Velis", "avel@mail.com", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("sliol", "Sofia", "Lioliou", "sliol@mail.com", true, "EL", new HashSet<>()));    }请问有人会帮助我吗?我尝试了不同的类型,但没有任何工作正常。
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

如果我正确理解你的问题,'.' 在正则表达式中被用作通配符。尝试在 . 类似于您将 * 替换为 * 的方式。


查看完整回答
反对 回复 2021-09-29
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

多个问题:

  1. 通过像这样连接用户输入,用户可以输入正则表达式,然后您将编译这些正则表达式并运行它们。这听起来不错,但请注意,它可能会构造正则表达式,这或多或少会导致服务器崩溃(占用大量 CPU 和 RAM),因此您可能不希望这样:您可以通过使用Pattern.quote. 这也解决了其他问题,其中字符串中的 .* 并不意味着您认为由于字符串的其余部分而导致的含义(例如,因为您位于可选组的中间,或者因为用户将他们查询中的问号)。如果您希望允许用户输入正则表达式,请获取整个字符串,不要尝试将 ' '替换为 ' 来弄乱它'。如果您不想要那样,请引用输入。

  2. 您使用^作为前缀和$后缀,这意味着正则表达式必须匹配整个输入,所以如果我搜索“foo@bar”,它不完全匹配“foo@bar.com”,因此,它赢了不行。解决方案是在开始和结束处添加一个额外的 .* 。

两者结合:

StringBuilder regexp = new StringBuilder("^");

for (String elem : query.trim().split("\\*")) regexp.append(".*").append(Pattern.quote(elem));

regexp.append(".*$");

Pattern pattern = Pattern.compile(regexp.toString(), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);


查看完整回答
反对 回复 2021-09-29
  • 3 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信