java量词如何“?”工作?

时间:2016-09-29 06:47:33

标签: java regex

System.out.println(Pattern.matches("[amn]?", "a"));

此语句返回true。

但是

System.out.println(Pattern.matches("[amn]?", "amn"));

System.out.println(Pattern.matches("[amn]?", "adef"));

这些语句返回false。

为什么?

我对正则表达量词的理解“?”就是这个。

正则表达式: X?
说明: X会发生一次或根本不发生

声明“[amn]?” “amn”应该返回true,因为a,m,n出现一次。 同样在“[amn]?” “adef”a只出现一次,m和n根本不出现。

我哪里错了?

5 个答案:

答案 0 :(得分:2)

正则表达式[amn]?匹配由amn组成的任何字符串。例如"a",它符合这个条件。

然而,

amnadef从这些字母中的一个开始,但是继续以便不符合“一次或完全没有”的规则。

答案 1 :(得分:1)

第一个返回true,因为a是一个字母,是a,m或n。

其他人返回false,因为那里没有一个字母,那里有3个和4个字母。

即使你的信件组包含3个字母,它也只会检查是否存在一个

答案 2 :(得分:1)

函数matches()将整个字符串与正则表达式匹配,这意味着只有完整字符串可以与表达式匹配时才返回true,而不是任何子序列。请参阅this documentation

[amn]?表示a或m或n可以存在一次或根本不存在。只有matches()将返回true的情况:

  1. “一”
  2. 的 “m”
  3. “n” 个
  4. “”
  5. 所有其他案件都将被视为错误。

    如果您想在某些字符串中找到正则表达式,请使用find(),如下所示。

        Pattern p = Pattern.compile("[amn]?");
        Matcher mat = p.matcher("");  //pass amn or adef
        boolean matches = false;
        while(mat.find()){
            matches = true;
            break;
        }
        System.out.println(matches);
    

答案 3 :(得分:1)

[amn]?是由字符“a”,“m”和“n”组成的组。 Pattern.matches表示“组中的一个字符[amn]或根本没有字符”。

(amn)?尝试将整个模式与整个输入字符串进行匹配。

如果你想要字符序列“amn”,你可以尝试[^/]+,这应该意味着“序列'amn'或者什么都没有。”

答案 4 :(得分:0)

?表示匹配当前正则表达式而不是贪心

相关问题