正则中圆括号()和方括号[]的区别是什么(总结)
一、总结
一句话总结:
1、圆括号是取多个,圆括号将括号里面的内容作为一组,方括号是取一个,就算写成这样[es|ed|s|ly|ing|d]也是一个个取,正确做法是用圆括号
2、方括号里面的|选择符号没有意义
3、圆括号还表示组,表示反向引用,
4、大括号表示数目
二、正则中圆括号()方括号[]大括号{}的区别和用法
之前遇到要用正则判断输入字符串的小需求中遇到了问题,连续的字符串不知道怎么判断。
如邮箱结尾的.com .cn .net等。
于是乎查阅资料:
括号() : 括号是多个匹配,它把括号内的当做一组来处理,限制一些多选的范围,比如上面的需求只能是com cn net结尾的用括号就是最好的选择。
括号能提取字符串,如(com|cn|net)就可以限制,只能是com或cn或net。
括号将括号里面的内容作为一组,这就是与[]不同的地方。
方括号[] : 方括号是单个匹配,如[abc]他限制的不是abc连续出现,而是只能是其中一个,这样写那么规则就是找到这个位置时只能是a或是b或是c;
方括号是正则表达式中最常用的,常用的用法有:[a-zA-Z0-9]匹配所有英文字母和数字,[^a-zA-Z0-9]匹配所有非英文字母和数字。
大括号{}: 大括号的用法很简单,就是匹配次数,它需要和其他有意义的正则表达式一起使用。
比如[a-c]{2}意思就是匹配a-c之间的一个字母出现且只出现两次;
比如(com){1}意思就是com必须出现一次
比如\W{1,3}意思就是非字母数字最少出现一次最多出现3次。
小结:正则表达式看起来很复杂但是学起来感觉一个顺序从左到右感觉又很容易,虽然正则表达式很容易懂,但是想要灵活应用却不容易。
三、正则表达式的圆括号和中括号的区别
现象
String regex = ".*\\b(bug|fix|error|fail|leak|resolve|miss|correct|ensure|should|#\\d*)[es|ed|s|ly|ing|d]?\\b.*";
Pattern bug = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = bug.matcher(message);
if(m.find()) return true;
return false;
使用串Fixes-most-inspector-warnings
来匹配的时候,无法匹配,但是将后面的中括号改为圆括号则可以匹配(es|ed|s|ly|ing|d)
,思考两者的区别
原因
[ ]中括号里面的字符都是单独的,也就是es|ed
被当做五个独立的字符,而不是es
或者ed
,而()圆括号则表示这是一个分组,分组里的|
有或者的含义
验证
public static void testExpression(){
String regex = "[a|b]";
Pattern p = Pattern.compile(regex);
String check = "|";
System.out.println(p.matcher(check).find());
}
public static void testExpression2(){
String regex = "(a|b)";
Pattern p = Pattern.compile(regex);
String check = "|";
System.out.println(p.matcher(check).find());
}
运行上述例子可以得到结果 True False,符合原因中的解释。
四、正则表达式中圆括号()跟方括号[]的区别是什么?
圆括号()是组,
示例:
1、(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致
2、(abc)?,表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现
3、(?:abc)表示找到这样abc这样一组,但不记录,不保存到$变量中,否则可以通过$x取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee),可以用$1获取(aaa)匹配到的内容,而$3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)匹配到的内容,因为前一对括号没有保存变量
方括号是单个匹配,
示例:
1、[0-3],表示找到这一个位置上的字符只能是0到3这四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符
方括号是任取一个,例如[A-Z],[0-9],[aeiou]等
圆括号有很多用处,例如创建group,例如src=(http.*?\.jpg)匹配所有src=开头,jpg结尾的图片地址,其中匹配结果的第一个group就是http...jpg的图片地址
另外,圆括号也可用来创建命名,建立反向引用,各种断言(肯定断言,否定断言,零宽断言等)