亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

MMTTMM 2021-09-29 13:09:51
我有 Java 問題。有一個 Web 應用程序,它具有在后端運行 Javascript 和 Java 的搜索功能。我們只能配置 Java 源代碼,不能配置 Javascript。問題是有一個ArrayList<UserDTO>. 每個UserDTO包含Id,FirstName,LastName,和email。當我*在搜索引擎中輸入時,所有的結果都List出現了。問題出在電子郵件上。如果我搜索一個名字或姓氏,則沒有問題。當我搜索一封電子郵件時,沒有任何效果。它只有在我搜索這樣的內容時才有效:fe 電子郵件是 [email protected],如果我輸入,* 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", "[email protected]", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("kpav", "Konstantinos", "Pavlopoulos", "[email protected]", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("echar", "Eleni", "Charalampous", "[email protected]", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("gchat", "Georgia", "Chatzipavlou", "[email protected]", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("avel", "Apostolos", "Velis", "[email protected]", true, "EL", new HashSet<>()));        USERS.add(new UserDTO("sliol", "Sofia", "Lioliou", "[email protected]", true, "EL", new HashSet<>()));    }請問有人會幫助我嗎?我嘗試了不同的類型,但沒有任何工作正常。
查看完整描述

3 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

如果我正確理解你的問題,'.' 在正則表達式中被用作通配符。嘗試在 . 類似于您將 * 替換為 * 的方式。


查看完整回答
反對 回復 2021-09-29
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

多個問題:

  1. 通過像這樣連接用戶輸入,用戶可以輸入正則表達式,然后您將編譯這些正則表達式并運行它們。這聽起來不錯,但請注意,它可能會構造正則表達式,這或多或少會導致服務器崩潰(占用大量 CPU 和 RAM),因此您可能不希望這樣:您可以通過使用Pattern.quote. 這也解決了其他問題,其中字符串中的 .* 并不意味著您認為由于字符串的其余部分而導致的含義(例如,因為您位于可選組的中間,或者因為用戶將他們查詢中的問號)。如果您希望允許用戶輸入正則表達式,請獲取整個字符串,不要嘗試將 ' '替換為 ' 來弄亂它。'。如果您不想要那樣,請引用輸入。

  2. 您使用^作為前綴和$后綴,這意味著正則表達式必須匹配整個輸入,所以如果我搜索“foo@bar”,它不完全匹配“[email protected]”,因此,它贏了不行。解決方案是在開始和結束處添加一個額外的 .* 。

兩者結合:

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 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號