繁体   English   中英

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

[英]Java regex to match all words in a string

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

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

基本上由|分隔的所有内容 是一个OR搜索,所有与+连在一起的单词都必须存在。

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

我尝试了以下AND搜索:

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

跟随或搜索

.*(abc|def).*

是否可以使用一个正则表达式? 任何例子都会有帮助

(abc|def|ghi)

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

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).

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

切记为正则表达式指定大小写敏感性。

编写了这个示例方法match(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();
}
assertTrue(Pattern.matches("\\((\\w+(\\||\\+))+\\w+\\)", "(abc|def|ghi|abc+def+ghi|def+ghi)"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM