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

时间:2015-12-23 19:01:38

标签: java regex search-multiple-words

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

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

基本上由|分隔的所有内容都是OR搜索 所有与+相关的词语都必须存在。

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

我尝试关注AND搜索:

(?=.*?\babc\b)(?=.*?\bdef\b)(?=(.*?\bghi\b)
OR搜索

以下

.*(abc|def).*

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

4 个答案:

答案 0 :(得分:1)

(abc|def|ghi)

这将匹配包含您正在寻找的单词的每个字符串。

答案 1 :(得分:1)

AND搜索

您列出以下内容:

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

我的版本:

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

请注意,在(测试之前,您的版本会显示额外的ghi

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

OR搜索

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

\babc\b|\bdef\b

OR

\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案例而不是uses SysUtils, TypInfo; type ERuntimeTypeError = class(Exception); TSet<T> = class strict private class function TypeInfo: PTypeInfo; inline; static; public class function IsSet: Boolean; static; class function Cardinality(const Value: T): Integer; static; end; const Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128); implementation { TSet<T> } class function TSet<T>.TypeInfo: PTypeInfo; begin Result := System.TypeInfo(T); end; class function TSet<T>.IsSet: Boolean; begin Result := TypeInfo.Kind=tkSet; end; function GetCardinality(const PSet: PByteArray; const SizeOfSet(*in bytes*): Integer): Integer; inline; var I, J: Integer; begin Result := 0; for I := 0 to SizeOfSet - 1 do for J := 0 to 7 do if (PSet^[I] and Masks[J]) > 0 then Inc(Result); end; class function TSet<T>.Cardinality(const Value: T): Integer; var EnumTypeData: PTypeData; begin if not IsSet then raise ERuntimeTypeError.Create('Invalid type in TSet<T>, T must be a set'); Result := GetCardinality(PByteArray(@Value), SizeOf(Value)); end; 指定的要求在中间的情况。

请记住为正则表达式指定您的案例敏感度。

答案 2 :(得分:1)

写了这个示例方法 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();
}

答案 3 :(得分:0)

assertTrue(Pattern.matches("\\((\\w+(\\||\\+))+\\w+\\)", "(abc|def|ghi|abc+def+ghi|def+ghi)"));