對於web來說,字元串的處理特別重要,而正則表達式是對字元串處理的利器,在字元過濾,驗證方面都能看到她的身影。 今天需要處理一段json字元串,在用String.replaceAll的過程中,遇到了正則表達式不會寫的尷尬場景。所以還是簡單地補補正則表達式的知識吧。 先從一個正則表達式的使用講起。 運 ...
對於web來說,字元串的處理特別重要,而正則表達式是對字元串處理的利器,在字元過濾,驗證方面都能看到她的身影。
今天需要處理一段json字元串,在用String.replaceAll的過程中,遇到了正則表達式不會寫的尷尬場景。所以還是簡單地補補正則表達式的知識吧。
先從一個正則表達式的使用講起。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { //這個正則表達式表示匹配1254-8888888,125-6966356這樣子的字元 String regex = "\\d{3,4}-\\d{7}"; //初始字元串 String str = "agdf/1254-8888888sssdf125-6966356"; String aft = str.replaceAll(regex, "替換"); System.out.println("repalceAll後==="+aft); Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); //m.find()為true則一直匹配下去 while(m.find()){ //因為正則表達式中沒有()括弧,所以捕獲組數為0 System.out.println("捕獲組數,m.groupCount==="+m.groupCount()); //m.group()相當於m.group(0),對應著groupCount,即直接匹配,不分組 System.out.println("m.group==="+m.group(0)); } } }
運行結果
repalceAll後===agdf/替換sssdf替換
m.group===1254-8888888
捕獲組數,m.groupCount===0
m.group===125-6966356
捕獲組數,m.groupCount===0
從那個正則表達式說起, String regex = "\\d{3,4}-\\d{7}";
"\\d"這個是java的轉義,本來的正則應該是“\d”,表示的是匹配0到9的數字,應該也可以寫成這樣[0-9],沒試過。
"\\d{3,4}"表示\d的個數有3到4個,即匹配123,3212,000這些數字,後面的“\\d{7}”同理,匹配8888888等字元。
至於分組這些,看下下麵這個demo
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { //這個正則表達式表示匹配1254-8888888,125-6966356這樣子的字元 String regex = "([a-zA-Z]+)(\\d{7})"; //初始字元串 String str = "AGdf12548888888sssdf1256966356"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); //m.find()為true則一直匹配下去 while(m.find()){ //因為正則表達式中沒有()括弧,所以捕獲組數為0 System.out.println("捕獲組數,m.groupCount==="+m.groupCount()); //m.group()相當於m.group(0),對應著groupCount,即直接匹配,不分組 System.out.println("m.group(0)==="+m.group(0)); //對應第一個括弧([a-zA-Z]+) System.out.println("m.group(1)==="+m.group(1)); //對應第二個括弧(\\d{7}) System.out.println("m.group(2)==="+m.group(2)); System.out.println("=============我是換行符============"); } } }
運行結果
捕獲組數,m.groupCount===2
m.group(0)===AGdf1254888
m.group(1)===AGdf
m.group(2)===1254888
=============我是換行符============
捕獲組數,m.groupCount===2
m.group(0)===sssdf1256966
m.group(1)===sssdf
m.group(2)===1256966
=============我是換行符============
最後再附帶下常用的正則表達式字元
字元的取值範圍
1.[abc] : 表示可能是a,可能是b,也可能是c。
2.[^abc]: 表示不是a,b,c中的任意一個
3.[a-zA-Z]: 表示是英文字母
4.[0-9]:表示是數字
簡潔的字元表示
.:匹配任意的字元
\d:表示數字
\D:表示非數字
\s:表示由空字元組成,[ \t\n\r\x\f]
\S:表示由非空字元組成,[^\s]
\w:表示字母、數字、下劃線,[a-zA-Z0-9_]
\W:表示不是由字母、數字、下劃線組成
數量表達式
1.?: 表示出現0次或1次
2.+: 表示出現1次或多次
3.*: 表示出現0次、1次或多次
4.{n}:表示出現n次
5.{n,m}:表示出現n~m次
6.{n,}:表示出現n次或n次以上
邏輯表達式
1.XY: 表示X後面跟著Y,這裡X和Y分別是正則表達式的一部分
2.X|Y:表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f
3.(X):子表達式,將X看做是一個整體