将字符串与多个正则表达式模式匹配

时间:2014-03-07 14:07:34

标签: java regex

我有一个输入字符串。

我正在考虑如何有效地将此字符串与多个正则表达式匹配。

Example Input: ABCD

我想与这些注册模式进行匹配,如果其中至少有一个匹配,则返回true

[a-zA-Z]{3}

^[^\\d].*

([\\w&&[^b]])*

我不确定如何一次匹配多个模式。有人可以告诉我我们如何有效地做到这一点?

6 个答案:

答案 0 :(得分:22)

如果您只有几个正则表达式,并且它们在编译时都是已知的,那么这就足够了:

private static final Pattern
  rx1 = Pattern.compile("..."),
  rx2 = Pattern.compile("..."),
  ...;

return rx1.matcher(s).matches() || rx2.matcher(s).matches() || ...;

如果它们中有更多,或者它们是在运行时加载的,那么使用模式列表:

final List<Pattern> rxs = new ArrayList<>();


for (Pattern rx : rxs) if (rx.matcher(input).matches()) return true;
return false;

答案 1 :(得分:19)

你可以从个别的那个中制作一个大的正则表达式:

[a-zA-Z]{3}|^[^\\d].*|([\\w&&[^b]])*

答案 2 :(得分:1)

我不确定effectively是什么意思,但是如果它是关于性能而你想要查看很多字符串,我会选择这个

...
static Pattern p1 = Pattern.compile("[a-zA-Z]{3}");
static Pattern p2 = Pattern.compile("^[^\\d].*");
static Pattern p3 = Pattern.compile("([\\w&&[^b]])*");

public static boolean test(String s){
   return p1.matcher(s).matches ? true: 
        p2.matcher(s).matches ? true: 
        p3.matcher(s).matches;
}

我不确定它会如何影响性能,但将它们全部合并到一个正则表达式|中也可以提供帮助。

答案 3 :(得分:1)

为避免重新创建Pattern和Matcher类的实例,您可以创建其中一个并重复使用它们。要重复使用Matcher类,您可以使用reset(newInput)方法。 警告:此方法不是线程安全的。仅当您可以保证只有一个线程能够使用此方法时才使用它,否则为每个方法调用创建单独的Matcher实例。

这是可能的代码示例之一

private static Matcher m1 = Pattern.compile("regex1").matcher("");
private static Matcher m2 = Pattern.compile("regex2").matcher("");
private static Matcher m3 = Pattern.compile("regex3").matcher("");

public boolean matchesAtLeastOneRegex(String input) {
    return     m1.reset(input).matches() 
            || m2.reset(input).matches()
            || m3.reset(input).matches();
}

答案 4 :(得分:0)

这是另一种选择。 请注意,有一件事是不按特定顺序返回它们。但是可以通过m.start()排序来做到这一点。

private static HashMap<String, String> regs = new HashMap<String, String>();

...

    regs.put("COMMA", ",");
    regs.put("ID", "[a-z][a-zA-Z0-9]*");
    regs.put("SEMI", ";");
    regs.put("GETS", ":=");
    regs.put("DOT", "\\.");

    for (HashMap.Entry<String, String> entry : regs.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        Matcher m = Pattern.compile(value).matcher("program var a, b, c; begin a := 0; end.");
        boolean f = m.find();
        while(f) 
        {
            System.out.println(key);
            System.out.print(m.group() + " ");
            System.out.print(m.start() + " ");
            System.out.println(m.end());
            f = m.find();
        }

    }   
}

答案 5 :(得分:0)

像(Running multiple regex patterns on String)中解释的那样,最好将每个正则表达式连接到一个大的正则表达式,而不是只运行一个匹配器。这是一个很大的改进,你经常重用正则表达式。