簡體   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