Java正则表达式匹配字符串中的所有单词

Posted

技术标签:

【中文标题】Java正则表达式匹配字符串中的所有单词【英文标题】:Java regex to match all words in a string 【发布时间】: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).*

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

【问题讨论】:

提供一些有效/无效的输入字符串。 【参考方案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”,它将如何匹配?

以上是关于Java正则表达式匹配字符串中的所有单词的主要内容,如果未能解决你的问题,请参考以下文章

javascript 正则表达式匹配任何脚本中所有非单词字符的正确正则表达式范围是多少?

正则表达式用来根据某种匹配模式寻找字符串中的某些单词。

精确匹配正则表达式中的多个单词(数据表)

如何在正则表达式中匹配多个单词

Python正则表达式,匹配最后一个单词

如何匹配以下字符串,但不包括JS中的单词字符与正则表达式?