超簡單!正規表示式總結

cshgy123發表於2020-11-05

正規表示式小總結
對於正規表示式,大學的時候就學過不過因為沒有仔細的好好聽課,導致工作後很長一段時間還是不是很熟悉,所以特意抽出個時間來總結一下用法。
\d表示任意一個數字0-9
\s表示任意一個空白字元,或換行符
\w表示任意一個字元 0-9 a-z A-Z 或下劃線
tip:如果d,s,w為大寫那麼就是求反向 例:\D即匹配一個非數字
. :表示匹配任意一個字元,僅限一個
如果匹配中文就用\u####表示
a\u548cc可以匹配a和c \u548c 為 ‘和’
\d* 可以匹配認識個字元,包括0字元,即0到任意個
\d+ 匹配1到任意個(至少一個)
\d? 可以匹配0或一個字元 例A? 可以匹配 空和A
\d{3} 可以匹配3個連著的數字
\d{3,5}可以匹配3-5個連著的數字
\d{{3,}可以匹配3個以上數字
\d{0,3}最多匹配3個數字

[abc]表示匹配方括號內任意一個字元
[a-zA-Z0-9]匹配指定範圍內字元
[^A-F]指定範圍以外字元
A\sB|A\sC|A\sD 匹配 A B或A C或A D
上面可以提取 A\s(B|C|D)

^匹配開頭,美元符號匹配結尾
^在方括號內的話代表取反 [^0-9]表示匹配一個非數字
^A\d+B[美元符號]表示匹配A開頭的B結尾的字串,中間包含的是任意1到多個數字

想要匹配區號
0851-2593112
0851-259\d{4}

分組匹配
常規匹配方式為
String.matcher()方法,括號內放正規表示式

分組的話即需要
Pattern p = Pattern.compile("(\d{3,4})\-(\d{7,8})");
Matcher m = p.matcher(“010-12345678”);
if (m.matches()) {
String g1 = m.group(1);
String g2 = m.group(2);
System.out.println(g1);
System.out.println(g2);
}
得到兩個匹配上的子串010和12345678。

貪婪匹配
一般預設是貪婪匹配,就是一個表示式儘可能多的匹配後面的字串
“123000”:3個0
“10100”:2個0
“1001”:0個0
如(\d+)(0*)這個的話那麼後面的(0*)就沒用了,因為前面的\d+就已經把所有的字串匹配完了,所以分組的時候就只會顯示一個組。這個時候可以在\d+變為\d+?變為非貪婪,這樣遇到0的時候發現後面的0可以匹配\d+就不會再往後匹配了。
tips:(\d??)(9
)前項表示匹配1個或0個數字後面表示非貪婪,如果是’9999‘的話,就可以分為兩組 ”“和”9999“
前面就預設為只匹配0個字元。

分割字串
String.split()方法傳入的正是正規表示式。
“a, b ;; c”.split("[\,\;\s]+"); // { “a”, “b”, “c” }
凡是遇到,;空格都是分割符

搜尋字串
String s = “the quick brown fox jumps over the lazy dog.”;
Pattern p = Pattern.compile("\wo\w");
Matcher m = p.matcher(s);
while (m.find()) {
String sub = s.substring(m.start(), m.end());
System.out.println(sub);
}
找出符合\w0\w的字串那麼只有
brown的row ,fox, dog
\w等於[A-Za-z0-9_]注意最後一個是下劃線

替換
String s = “The quick\t\t brown fox jumps over the lazy dog.”;
String r = s.replaceAll("\s+", " ");
System.out.println®; // “The quick brown fox jumps over the lazy dog.”
用一個空格字串替換調 \s+(這個是代表有一個或多個空格字元或者tab)

反向引用
String s = “the quick brown fox jumps over the lazy dog.”;
String r = s.replaceAll("\s([a-z]{4})\s", " $1 ");
System.out.println®;
$1代表是被匹配到的字串
the quick brown fox jumps over the lazy dog.

分割字串:String.split()
搜尋子串:Matcher.find()
替換字串:String.replaceAll()

相關文章