【问题标题】:Java regex to match all words in a stringJava正则表达式匹配字符串中的所有单词
【发布时间】:2015-12-23 19:01:38
【问题描述】:

我正在寻找一个匹配以下模式的正则表达式

(abc|def|ghi|abc+def+ghi|def+ghi)

基本上由| 分隔的所有内容都是 OR 搜索 并且所有与+ 连接的词都必须存在。

我必须根据上述格式的输入字符串动态构造正则表达式。

我尝试了以下 AND 搜索:

(?=.*?\babc\b)(?=.*?\bdef\b)(?=(.*?\bghi\b)

跟随 OR 搜索

.*(abc|def).*

是否有可能的单个正则表达式?任何例子都会有所帮助

【问题讨论】:

  • 提供一些有效/无效的输入字符串。

标签: java regex search-multiple-words


【解决方案1】:
(abc|def|ghi)

这将匹配包含您要查找的单词的每个字符串。

【讨论】:

  • 它不会将搜索限制为 abc+def+ghi,即所有三个单词都必须存在。
  • 为什么要限制搜索?您不是也在搜索 abc、def 或 ghi 吗?任何单独找到这三个的东西也会找到 abc+def+ghi 和 def+ghi。
【解决方案2】:

AND 搜索

您列出以下内容:

(?=.*?\babc\b)(?=.*?\bdef\b)(?=(.*?\bghi\b)

我的版本:

(?=.*?\babc\b)(?=.*?\bdef\b)(?=.*?\bghi\b).

请注意,您的版本会在 ghi 测试之前出现一个额外的 (

还请注意,我在末尾包含了一个.(捕获任何单个字符),这样正则表达式实际上可以匹配某些内容,否则您只是在进行前瞻而不进行实际搜索。

OR 搜索

要搜索"abc" OR "def",我会使用以下正则表达式:

\babc\b|\bdef\b

\b(?:abc|def)\b

结合

因此,对于您的 (abc|def|ghi|abc+def+ghi|def+ghi) 示例,实际的正则表达式可能如下所示:

\babc\b|\bdef\b|\bghi\b|(?=.*?\babc\b)(?=.*?\bdef\b)(?=.*?\bghi\b).|(?=.*?\bdef\b)(?=.*?\bghi\b).

这是一个不好的例子,因为它自己会匹配 abc,因为第一个 OR 案例而不是中间 AND 案例指定的要求。

记得指定正则表达式的大小写敏感度。

【讨论】:

    【解决方案3】:

    编写了这个示例方法ma​​tch(String input, String searchFilter)

    public static void main(String[] args) {
        String input = " dsfsdf Invalid Locatio sdfsdff Invalid c Test1 xx Test2";
        String searchFilter = "Invalid Pref Code|Invalid Location+Invalid company|Test|Test1+Test2";
        System.out.println(match(input, searchFilter));
    }
    
    /**
     * @param input
     * @param searchFilter
     */
    private static boolean match(String input, String searchFilter) {
        List<String> searchParts = Arrays.asList(searchFilter.split("\\|"));
        ArrayList<String> ms = new ArrayList<String>();
        ArrayList<String> ps = new ArrayList<String>();
        for (String pls : searchParts) {
            if (pls.indexOf("+") > 0) {
                ms.add(pls);
            } else {
                ps.add(pls);
            }
        }
        ArrayList<String> patterns = new ArrayList<>();
        for (String msb : ms) {
            StringBuffer sb = new StringBuffer();
            for (String msbp : msb.trim().split("\\+")) {
                sb.append("(?=.*?\\b").append(msbp.trim()).append("\\b).");
            }
            patterns.add(sb.toString());
        }
        Pattern p = Pattern
                .compile("\\b(?:" + StringUtils.join(ps, "|") + ")\\b|"+ StringUtils.join(patterns, "|"), 
                        Pattern.CASE_INSENSITIVE);
        return p.matcher(input).find();
    }
    

    【讨论】:

      【解决方案4】:
      assertTrue(Pattern.matches("\\((\\w+(\\||\\+))+\\w+\\)", "(abc|def|ghi|abc+def+ghi|def+ghi)"));
      

      【讨论】:

      • 所以如果我传入一个输入字符串“hey abc, hi def, yo ghi”,它将如何匹配?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2011-12-13
      • 2017-08-28
      • 1970-01-01
      • 2014-07-09
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多