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根本不出现。
我哪里错了?
答案 0 :(得分:2)
正则表达式[amn]?
匹配由a
,m
或n
组成的任何字符串。例如"a"
,它符合这个条件。
amn
和adef
从这些字母中的一个开始,但是继续以便不符合“一次或完全没有”的规则。
答案 1 :(得分:1)
第一个返回true,因为a
是一个字母,是a,m或n。
其他人返回false,因为那里没有一个字母,那里有3个和4个字母。
即使你的信件组包含3个字母,它也只会检查是否存在一个。
答案 2 :(得分:1)
函数matches()
将整个字符串与正则表达式匹配,这意味着只有完整字符串可以与表达式匹配时才返回true
,而不是任何子序列。请参阅this documentation。
[amn]?
表示a或m或n可以存在一次或根本不存在。只有matches()
将返回true
的情况:
所有其他案件都将被视为错误。
如果您想在某些字符串中找到正则表达式,请使用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)
?表示匹配当前正则表达式而不是贪心