Java正则中'?'与'+'的行为:为何Pattern.matches返回false?
为什么
Pattern.matches("[abc]?", "abc")返回false? 哈哈,这绝对是正则入门时最容易踩的坑之一!你没注意到Java里Pattern.matches()的核心规则:它要求正则表达式必须完全匹配整个输入字符串,而不是匹配字符串里的某一段~
先看你贴的代码:
import java.util.regex.*; public class Main { public static void main(String[] args) { System.out.println(Pattern.matches("[abc]?", "abc")); //false System.out.println(Pattern.matches("[abc]+", "abc")); //true } }
下面拆解两个正则的匹配逻辑,你就能明白差异了:
1. [abc]?为啥匹配失败?
[abc]的意思是匹配单个a/b/c字符,加上?量词后,规则变成:匹配这个单个字符零次或一次。也就是说,这个正则能匹配的字符串只有两种情况:
- 空字符串(零次匹配)
- 单个a、单个b、或者单个c(一次匹配)
而你的输入是"abc",长度是3,这个正则最多只能匹配第一个字符a,剩下的bc根本没被覆盖到——因为Pattern.matches()要求整个字符串都被匹配,所以自然返回false。
2. [abc]+为啥匹配成功?
+量词的意思是匹配前面的元素一次或多次,所以[abc]+可以匹配任意长度≥1的连续a/b/c字符序列。"abc"刚好就是由三个a/b/c字符组成的,整个字符串都被正则覆盖了,所以返回true,符合你的预期。
补充:如果只想匹配子串怎么办?
要是你只是想检查字符串里有没有a/b/c中的任意一个(零次或一次),而不是要求整个字符串都匹配,那得用Matcher.find()方法,示例代码如下:
import java.util.regex.*; public class Main { public static void main(String[] args) { Pattern pattern = Pattern.compile("[abc]?"); Matcher matcher = pattern.matcher("abc"); System.out.println(matcher.find()); // 返回true,因为能找到匹配的子串(比如开头的a) } }
一句话总结
Pattern.matches()是「全量匹配」,[abc]?最多只能匹配1个字符,撑不起长度为3的"abc";而[abc]+可以匹配任意长度的a/b/c序列,刚好覆盖整个输入。
内容的提问来源于stack exchange,提问作者Ajay Singh
相关产品推荐
相关产品推荐

