之前了解的regex中的()
只是方便和?+ * |
这类的符号的匹配以达到划分范围的目的。
比如说这个:"([+]|-)"
这个表达式匹配的是+
或-
,而不是[+
后跟着]
或-
如果是第二种意思得这么写"(\[+(])|-)"
这个例子很容易的就说明了[]中的意思和没有括号是不同的,以及括号的意思是用来划分范围,即分组
今天了解到这个括号还有一个其他的用途就是捕获。捕获就是为了解决"越来越牛逼"这种 ABAC型问题。
Pattern pattern= Pattern.compile("(\\w).+\\1.+");
写法很简单\w的意思是[a-zA-Z0-9]
()代表了分组这里的\w第一个出现所以放在了第一组中
.+的意思匹配多个非/n的字符
\\1的意思是重复出现匹配第一组匹配成功后的信息
看懂了这些也就自然能理解为什么能匹配越来越牛逼了
分组有时候也会因相互嵌套而变得复杂起来,比如我想要表示信用卡的余额:
金额是有正有负的整数或小数,金额为正可以省略正号,甚至只写小数点后面两位也可以识别,于是就有了下面的正则表达式
"(([+]|-)?\\d+(.\\d{1,2})?)|(.\\d{1,2})"
“+12”;//成功
“-123”;//成功
“12.3”;//成功
" .12";//成功
“.”;//失败
“123.”;//失败
.123";//失败
“+.12”//失败
这个式子中的括号就看着比刚才的难多了,因为这时候出现了嵌套,那么这时候该怎么分组呢?
其实很简单
分别对1234号括号的内容进行捕获保存到了1234四个组中,不过这有引出了一个新的问题,有时候我只想用括号分个组并不需要捕获啊,这时候就引出了一个新的元字符(?: ··· )
这时候()
就代表着只分组不捕获的意思了。注意不要跟?
搞混了