正則中圓括號()和方括號[]的區別是什么(總結)
一、總結
一句話總結:
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的圖片地址
另外,圓括號也可用來創建命名,建立反向引用,各種斷言(肯定斷言,否定斷言,零寬斷言等)