這篇文章我們簡略的講一下java的正則表達式
目錄
1.正則表達式概述
2.正則表達式的簡單匹配規(guī)則
3.正則表達式的復(fù)雜匹配規(guī)則
4.正則表達式的分組匹配規(guī)則
5.正則表達式的非貪婪匹配
6.使用正則表達式進行搜索和替換
1.正則表達式概述
首先,我們需要明確一個觀點,什么是正則表達式?
正則表達式:可以定義出一個字符串的結(jié)構(gòu)特征,然后我們可以利用這個特征來查找、匹配、替換一個字符串中的某些內(nèi)容。
解釋:其實很好理解。就比如這里有一個字符串,很復(fù)雜,但是呢,我知道一些子串或者說具體的部分內(nèi)容,現(xiàn)在我想匹配一下這個字符串里面是否含有這些子串,或者說這個字符串是否符合我的目標(biāo)格式,又或者說,我只知道一個大概的字符串特征,但是我想在一大堆字符串中查找一個有這個特征的字符串,等等等等,這些操作都是靠正則表達式來完成的
案例演示:
需求:給出字符串“3ahfget56adwnf8adba4jk5sg6wfa4dw”,現(xiàn)在要求將該字符串中但凡出現(xiàn)“數(shù)組+a”的部分全部替換為“---”
代碼如下:
代碼:
public class zhengzeTest {
public static void main(String[] args) {
String s = "3ahfget56adwnf8adba4jk5sg6wfa4dw";
String r = s.replaceAll("\\da","--");
System.out.println("r = "+r);
}
}
?解析:初看很簡單,再看很復(fù)雜。字符串替換,我們都會,因為有java提供的StringAPI,但是,這些替換都是將具體的內(nèi)容替換為新的內(nèi)容,而現(xiàn)在我們要求的是將“數(shù)字+a”這個內(nèi)容替換為新內(nèi)容,這個內(nèi)容不是固定的啊,它可以是“1a”可以是“3a”,它不是固定的,這就很麻煩。這個時候就要用到正則表達式了。正則表達式的定義就是,我們定義一個字符創(chuàng)的結(jié)構(gòu)特征,然后我們利用這個特征來對字符串進行相應(yīng)的操作。所以我們就要定義一個字符串的結(jié)構(gòu)特征,這個特征是“xa”,但凡符合這個特征的部分,都要被替換。這就是正則表達式的作用。
到此,我們算是初步的認(rèn)識了什么是正則表達式,正則表達式有什么用,用在什么地方了。
2.正則表達式的簡單匹配規(guī)則
下面來講一下正則表達式的簡單匹配規(guī)則
正則表達式的匹配規(guī)則:從左到右按規(guī)則匹配
下面就結(jié)合具體的實例來講一下。
如果,我們編寫了一個正則表達式“abc”,那么在匹配時,就只能匹配“abc”,不能匹配“Abc”或者“ab”或者“ac”
如果,我們編寫了一個正則表達式“a\&c”,那么在匹配時,就只能匹配“a&c”,不能匹配“Ac”或者“ac”或者“aC”
如果,我們編寫了一個正則表達式“a\u548cc”,那么在匹配時,就只能匹配“a與c”,不能匹配“A與c”或者“ac”或者“AC”。在正則表達式中,如果我們需要表示漢字,則我們需要其對應(yīng)的Unicode字符
如果,我們編寫了一個正則表達式“a.c”,那么在匹配時,就能匹配“a與c”或者“abc”,不能匹配“A與c”或者“ac”或者“AC”。在正則表達式中,我們用“.”來代表一個任意字符
如果,我們編寫了一個正則表達式“a\dc”,那么在匹配時,就能匹配“a0c”或者“a1c”或者“a2c”,不能匹配“A與c”或者“ac”或者“AC”。在正則表達式中,我們用“\d”來代表一個任意數(shù)字
如果,我們編寫了一個正則表達式“a\wc”,那么在匹配時,就能匹配“a_c”或者“abc”或者“a2c”,不能匹配“A與c”或者“ac”或者“AC”。在正則表達式中,我們用“ \w ”來代表一個任意字母,數(shù)字,下劃線
如果,我們編寫了一個正則表達式“a\sc”,那么在匹配時,就能匹配“a c”或者“a????????c”,不能匹配“A與c”或者“ac”或者“AC”。在正則表達式中,我們用“\s”來代表一個空格或者一個Tab
如果,我們編寫了一個正則表達式“a\Dc”,那么在匹配時,就能匹配“aAc”或者“a#c”,不能匹配“A2c”或者“ac”或者“AC”。在正則表達式中,我們用“\D”來代表一個非數(shù)字
如果,我們編寫了一個正則表達式“a\Wc”,那么在匹配時,就能匹配“a!c”或者“a c”,不能匹配“A2c”或者“ac”或者“AC”。在正則表達式中,我們用“\W”來代表一個非數(shù)字,字母,或下劃線
如果,我們編寫了一個正則表達式“a\d*”,那么在匹配時,就能匹配“a12”或者“a123”,不能匹配“A c”或者“a!”。在正則表達式中,我們用“*”來代表一個任意個字符,它的作用其實就是先匹配a,然后匹配"\d",然后因為有“*”,所以就可以有任意個“\d”了
如果,我們編寫了一個正則表達式“a\d+”,那么在匹配時,就能匹配“a1”或者“a12”,不能匹配“A與c”或者“a”或者“AC”。在正則表達式中,我們用“+”來表示,至少有一個+前面的正則表達式字符
如果,我們編寫了一個正則表達式“a\d?”,那么在匹配時,就能匹配“a”或者“a1”,不能匹配“A與c”或者“a12”或者“AC”。在正則表達式中,我們用“?”來表示零個或者一個其前面的正則表達式字符
如果,我們編寫了一個正則表達式“\d{3}”,那么在匹配時,就能匹配“123”或者“234”,不能匹配“12”或者“1234”或者“1”。在正則表達式中,我們用“{n}”來表示,應(yīng)該有n個其前面的字符
如果,我們編寫了一個正則表達式“\d{3,5}”,那么在匹配時,就能匹配“123”或者“2345”或者“23456”,不能匹配“12”或者“123456”或者“1”。在正則表達式中,我們用“{n,m}”來表示,應(yīng)該有n-m個其前面的字符
如果,我們編寫了一個正則表達式“\d{3,}”,那么在匹配時,就能匹配“123”或者“2344687”,不能匹配“12”或者“1”。在正則表達式中,我們用“{n,}”來表示,應(yīng)該至少有n個其前面的字符
下面用一張表來概述一下正則表達式的匹配規(guī)則:
正則表達式 | 規(guī)則 | 可以匹配 |
A | 指定字符 | A |
\u548c | 指定的Unicode字符 | 和 |
. | 任意字符 | a,b,&,0 |
\d | 0~9 | 0,1,2,……,9 |
\w | a~z,A~Z,0~9,_ | a,A,0,_,…… |
\s | 空格,Tab鍵 | 略 |
\D | 非數(shù)字 | a,A,&,_,…… |
\W | 非\w | &,@,中,…… |
\S | 非\s | a,A,&,_,…… |
AB* | 任意個數(shù)字符 | A,AB,ABB,ABBB |
AB+ | 至少1個字符 | AB,ABB,ABBB |
AB? | 0個或者1個字符 | A,AB |
AB{3} | 指定個數(shù)字符 | ABBB |
AB{1,3} | 指定范圍個數(shù)字符 | AB,ABB,ABBB |
AB{2,} | 至少n個字符 | ABB,ABBBB,…… |
AB{0,3} | 至多n個字符 | A,AB,ABB,ABBB |
3.正則表達式的復(fù)雜匹配規(guī)則
下面來講一下正則表達式的復(fù)雜匹配規(guī)則
如果,我們編寫了一個正則表達式“^A\d{3}$”,那么在匹配時,就能匹配“A001”或者“A999”,不能匹配“B001”或者“A0001”。在正則表達式中,我們用^和$來匹配開頭和結(jié)尾
如果,我們編寫了一個正則表達式“[abc]1”,那么在匹配時,就能匹配“a1”或者“b1”或者“c1”,不能匹配“B1”或者“d1”。在正則表達式中,我們用[ ] 來匹配范圍內(nèi)的字符
拓展:[a-f]:a,b……f;[a-f0-9]{3}:aaa,a2d,123……
如果,我們編寫了一個正則表達“[^0-5]{3}”,那么在匹配時,就能匹配“789”或者“689”或者“ac8”,不能匹配“a21”或者“132”。在正則表達式中,我們用[^……]來匹配非范圍內(nèi)的字符
如果,我們編寫了一個正則表達“AB|CD”,那么在匹配時,就能匹配“AB”或者“CD”,不能匹配“ABCD”或者“AC”。在正則表達式中,我們用“ |?”來表示選擇
正則表達式 | 規(guī)則 | 可以匹配 |
^ | 開頭 | 字符串開頭 |
$ | 結(jié)尾 | 字符串結(jié)尾 |
[ABC] | [……]內(nèi)任意字符 | A,B,C |
[A-F0-9xy] | 指定范圍的字符 | A……F,0-9,x,y |
[^A-F] | 指定范圍外的字符 | 非A……F |
AB|CD | AB或者CD | AB,CD |
4.正則表達式的分組匹配規(guī)則
正則表達式的分組匹配其實就是利用()來完成的,我們只需要在正則表達式的相應(yīng)位置加上()就行,就是相當(dāng)于改變了一下順序而已
5.正則表達式的非貪婪匹配
下面用一個例子來講解一下正則表達式的貪婪匹配和非貪婪匹配
例:我們需要判斷一串?dāng)?shù)字末尾0的個數(shù)
如下所示:“123000”:3個0;“12300”:2個0;“123”:0個0
我們可以的初始反應(yīng)一個是需要這樣寫:“^(\d+)(0*)”
為什么會出現(xiàn)這樣的結(jié)果呢?因為正則表達式默認(rèn)的是貪婪匹配,就是說在匹配“^(\d+)”時,它會盡可能多的匹配,所以就會出現(xiàn)上面的結(jié)果
那應(yīng)該怎么解決呢?使用非貪婪匹配
非貪婪匹配就是盡可能少的匹配,它是用“?”來實現(xiàn)的,所以為了實現(xiàn)上面的案例,我們的正則表達式應(yīng)該為“^(\d+?)(0*)”
這就是非貪婪匹配
6.使用正則表達式進行搜索和替換
使用正則表達式對字符串進行搜索和替換,其實本質(zhì)上就是對StringAPI的調(diào)用。我們需要熟悉StringAPI,然后熟悉正則表達式,編寫正確的正則表達式就可以啦。文章來源:http://www.zghlxwxcb.cn/news/detail-429142.html
在java中正則表達式并不是一個重點內(nèi)容,但是大家還是要有所了解。文章來源地址http://www.zghlxwxcb.cn/news/detail-429142.html
到了這里,關(guān)于java基礎(chǔ)知識——23.正則表達式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!