为什么 Pattern.matches( "[a*mn]" , "aaaa" ) 不返回 true?应该使用什么正确的代码来获得所需的输出?



我想创建一个模式,其中所需的字符串应为一个包括null的倍数,即a*,或者应该是一个m或单个n。但是以下代码没有提供所需的输出。

class Solution {
            public static void main(String args[]) {
                System.out.println(Pattern.matches("[a*mn]", "aaaa"));
        }
}

*在字符类中([](只是 *,而不是量词。

我想创建一个模式,其中所需的字符串应为包括null的倍数,即a*,或者应该是一个m或单个m或单个n。

您需要一个交替(|(: a*|[mn]

Pattern.matches("a*|[mn]", "aaaa")

实时示例:

import java.util.regex.Pattern;
class Example {
    public static void main (String[] args) throws java.lang.Exception {
        check("aaaa", true);
        check("a", true);
        check("", true);
        check("m", true);
        check("n", true);
        check("mn", false);
        check("q", false);
        check("nnnn", false);
    }
    private static void check(String text, boolean expect) {
        boolean result = Pattern.matches("a*|[mn]", text);
        System.out.println(
            (result ? "Match   " : "No match") +
            (result == expect ? " OK    " : " ERROR ") +
            ": " + text
        );
    }
}

...显然,如果您真的反复使用模式,则需要对其进行编译并重复使用结果。

尝试此正则

(a*)|m|n
Pattern.matches("(a*)|m|n", "") // true, match 1st group
Pattern.matches("(a*)|m|n", "a") // true, match 1st group
Pattern.matches("(a*)|m|n", "aaaa") // true, match 1st group
Pattern.matches("(a*)|m|n", "m") // true, match `n`
Pattern.matches("(a*)|m|n", "n") // true, match `m`
Pattern.matches("(a*)|m|n", "man") // false
Pattern.matches("(a*)|m|n", "mn") // false

[]内部" "不是量词,因此,如果存在以至于等级中的一个字符,您将获得正确字符串为" a"," "," m"或" n"。其余的将导致错误。您的正则是:

([aa*]*| [mn](

只有输入" A"的倍数(包括" A*"或单个" M"或" N"(才是正确的。通过以下示例检查它:

System.out.println("[aa*]*|[mn]","m");
System.out.println("[aa*]*|[mn]","aaaaa");
System.out.println("[aa*]*|[mn]","a*a*");

最新更新