繁体   English   中英

为什么Pattern.matches(“ [a * mn]”,“ aaaa”)返回true? 什么是适当的代码才能获得所需的输出?

[英]Why doesn't Pattern.matches(“[a*mn]”,“aaaa”) return true? What should be proper code to get the desired output?

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

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

*字符类内( []仅仅是一个* ,而不是一个量词。

我想创建一个模式,其中所需的字符串应为a的倍数,包括null,即a *,或者应为单个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

在[]内,“ ”不是量词,因此如果存在正则表达式中的字符之一,则将得到true,因此如果字符串为“ 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*");

暂无
暂无

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

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