使用正则把数字前面的符号替换_正则表达式(一) 基本表达式
定義
正則表達(dá)式(Regular Expression)
用某種模式去匹配一類字符串的公式,主要用來(lái)描述字符串匹配的工具。
匹配
文本或字符存在不止一個(gè)部分滿足給定的正則表達(dá)式,這是每一個(gè)這樣的部分都被稱為一個(gè)匹配。 匹配分為以下三種類型:
即一個(gè)字符串匹配一個(gè)正則表達(dá)式
即在文本或字符串里匹配正則表達(dá)式
即字符串中滿足給定的正則表達(dá)式的一部分
元字符
元字符(Metacharacter)是一類非常特殊的字符,它能夠匹配一個(gè)位置或字符集合中的一個(gè)字符,元字符可以分為兩種類型
- 匹配位置的元字符
- 匹配字符的元字符
元字符只能匹配一個(gè)字符位置,也就是一個(gè)匹配的單位是一個(gè)字符,而不是一個(gè)字符串
匹配位置的元字符
測(cè)試
- ^a
匹配第一個(gè)字母為a的一行 - a$
匹配最后一個(gè)字母為a的一行 - ^a$
匹配只有一個(gè)字母a的一行 - bStr
匹配以Str為開頭的單詞 - ingb
匹配以ing為結(jié)尾的單詞 - bStringb
僅匹配String這個(gè)單詞
b字符如何識(shí)別哪個(gè)是單詞呢?
以標(biāo)點(diǎn)符號(hào)或空格分隔的字符串將被識(shí)別為單詞,而且 b只能用于英文,不能用于中文
匹配字符的元字符
元字符都是按照單個(gè)字符進(jìn)行匹配
測(cè)試
- .
全部字符匹配 - w
匹配了全部的單詞字符,除了下劃線之外的標(biāo)點(diǎn)符號(hào)和漢字都被排除在外 - W
匹配結(jié)果和w剛好相反,注意那個(gè)下劃線是屬于單詞字符的 - s
有2個(gè)空格被匹配,注意!這里總共有6個(gè)符號(hào)被匹配了,除了兩個(gè)空格還有1~4行末的換行符 - S
除了2個(gè)空格和4個(gè)換行符,其余字符全部匹配 - d
匹配所有的數(shù)字 - D
匹配所有數(shù)字之外的字符
元字符組合
僅僅是元字符就可以自由組合來(lái)實(shí)現(xiàn)不同的匹配效果
- ww
匹配連續(xù)的兩個(gè)單詞字符 - ws
注意第三行最后匹配的m是和行末的換行符一起匹配成功的
文字匹配
字符類
字符類是一個(gè)字符集合,如果該字符集合中的任何一個(gè)字符被匹配,則它會(huì)找到該匹配項(xiàng)。
- []
字符類使用中括號(hào)作為標(biāo)志,字符集合寫在中括號(hào)里面,意為匹配中括號(hào)中的任意一個(gè)字符 - -
- 當(dāng)-符號(hào)不是第一個(gè)字符的時(shí)候表示定義字符的范圍*,例如[1-3]表示[123],[a-z]表示匹配任意小寫字母,如果-放在第一位,那就僅表示自己,這個(gè)范圍的順序和兩個(gè)字符間的內(nèi)容是按照ASCII表的順序決定的,例如[9-1]是違反ASCII表順序的一個(gè)表達(dá)式,這會(huì)報(bào)錯(cuò)
- ^
如果放在字符類第一個(gè),表示該字符類的否定,[^123]表示匹配1、2、3之外的所有數(shù)字 - 元字符在字符類中不做任何特殊處理,僅僅表示他們自身
測(cè)試
- [aeiou]
匹配元音字母 - [a-z]
匹配從小寫字母a到z之間的所有字母 - [^aeiou]
匹配元音字母之外的所有字符(包括任意符號(hào)) - [^a-z]
匹配小寫字母a到z之間的所有字母之外的所有字符 - [0-9]
匹配從0到9之間的任意一個(gè)數(shù)字 - [ao-u]
匹配a和o到u之間的所有字母,可以看到只要在連個(gè)字符之間使用連接符-就會(huì)判斷為一個(gè)區(qū)間 - [!-?]
匹配從!到?之間的任意一個(gè)符號(hào),可以看到因?yàn)槭前凑誂SCII表順序來(lái)判斷-連接的字符集合,所以這樣寫也是沒有問(wèn)題的 - [a^-]
匹配字符a、^和-三個(gè)字符,只要^符號(hào)不在第一位,-符號(hào)不在兩個(gè)字符中間,那么它們就只表示自身 - a[no]
匹配字符串a(chǎn)n或ao,這是字符類和元字符的組合
字符轉(zhuǎn)義
之前介紹的元字符非常好用,但是這又引出了一個(gè)問(wèn)題,如果我們想在正常的表達(dá)式里面使用元字符本身這個(gè)符號(hào)怎么辦呢?難道每次都要寫在字符類里面嗎?
當(dāng)然不,這里就引出了我們的字符轉(zhuǎn)義
正則表達(dá)式定義了一些特殊的元字符,如^、$、.等。由于這些字符在正則表達(dá)式中被解釋成其他指定的含義,如果需要匹配這些字符,則需要使用字符轉(zhuǎn)義來(lái)解決這個(gè)問(wèn)題。轉(zhuǎn)義字符使用符號(hào)(反斜杠),它可以取消這些字符(如^、$、.等)在表達(dá)式中具有的特殊意義。
- .
匹配字符. - *
匹配字符*
匹配字符- www.lanyuanxiaoyao.com
匹配字符串www.lanyuanxiaoyao.com,網(wǎng)址中的dot符號(hào)也是需要轉(zhuǎn)義的
常用轉(zhuǎn)義字符
限定符
這是一個(gè)重要的知識(shí)點(diǎn)限定符用于指定允許特定字符或字符集自身重復(fù)出現(xiàn)的次數(shù)。
測(cè)試
- a{3}
- a{2,}
- a{2,3}
- ab+
- ab?
- ab*
- ab+?
- ab??
- ab*?
貪婪模式與懶惰模式
如果在限定符*、+、?、{n}、{n,}和{n,m}之后再添加一個(gè)字符 ? ,則表示 盡可能少地重復(fù)字符?之前的限定符號(hào)的重復(fù)次數(shù),這種匹配方式稱為懶惰匹配,與之相對(duì)的,如果沒有字符 ? ,僅僅使用單個(gè)限定符*、+、?、{n}、{n,}和{n,m}的匹配,就稱為貪婪匹配。 看起來(lái)好像很復(fù)雜,但是理解歷來(lái)并不難,即懶惰匹配模式只匹配最短符合表達(dá)式的字符串,貪婪匹配模式只匹配最長(zhǎng)符合表達(dá)式的字符串。這里的貪婪模式和懶惰模式在不同的教程或者說(shuō)明里面都有不同的叫法,所以可以理解意思就行了,大同小異
測(cè)試
- 貪婪模式 a.*b
可以看到這里只有一個(gè)匹配,就是整個(gè)字符串,因?yàn)檫@是最長(zhǎng)的匹配 - 懶惰模式 a.?b
這里一旦發(fā)現(xiàn)一個(gè)匹配立刻就完成當(dāng)前的匹配,然后從下一個(gè)字符開始新的匹配,所以這里會(huì)有4個(gè)匹配
字符的運(yùn)算
替換
替換使用字符|來(lái)表示,表示如果某一個(gè)字符串匹配了表達(dá)式中字符|左邊或者右邊的規(guī)則,那么這個(gè)字符串就匹配了這個(gè)表達(dá)式|表示“或”的意思,這個(gè)符號(hào)和代碼中的“邏輯或”相同,比較好理解匹配是根據(jù)左邊優(yōu)先的原則,即從左往右,當(dāng)左邊的表達(dá)式不滿足的時(shí)候,才會(huì)去嘗試右邊的表達(dá)式
測(cè)試
- a|b
可以看到不管是字符a還是b都可以匹配這個(gè)表達(dá)式,它等同于[ab]
分組
分組又被稱為子表達(dá)式,即把一個(gè)正則表達(dá)式的全部或部分分成一個(gè)或多個(gè)組,分組使用()來(lái)表示,括號(hào)中的表達(dá)式就是一個(gè)組,一個(gè)組就是一個(gè)整體
要注意和字符類[]區(qū)分開來(lái),[123]是表示匹配字符1或2或3,而(123)就是匹配123這個(gè)字符串
反向引用
組號(hào)
當(dāng)一個(gè)正則表達(dá)式被分組之后,默認(rèn)從左到右每一個(gè)分組都會(huì)自動(dòng)被賦予一個(gè)組號(hào),以左括號(hào)(為分界從1開始自增,第一個(gè)組的組號(hào)是1,第二個(gè)組的組號(hào)是2,以此類推,在后面的表達(dá)式,使用組號(hào)的方式來(lái)引用前面的組,例如b(w)1b這個(gè)表達(dá)式中,后面的1就是對(duì)前面(w)組的引用 自定義組號(hào)
分組不止會(huì)自動(dòng)使用數(shù)字作為組號(hào),還可以手動(dòng)命名,形式為(?<name>),(?<word>w)和(?'word'w)都是把w+匹配到的字母保存到名為word的分組,自定義命名的分組使用k<name>的方式使用 ,如b(?<word>w)k<word>b是匹配連續(xù)的相同的兩個(gè)字母的單詞 反向引用
提供了查找重復(fù)字符組的簡(jiǎn)便方法,可以認(rèn)為是再次匹配同一個(gè)字符組的快捷指令反向引用引用的是前面的表達(dá)式匹配到的字符串,而不是前面的表達(dá)式
例如,b(w)1b 這個(gè)表達(dá)式中的1表示的是前面w匹配到的字符,前面匹配到字母a那么1處也必須替換為字母a,而不是任意一個(gè)字母 所以這個(gè)表達(dá)式匹配的是兩個(gè)完全相同的字母 而如果是b(w)wb 則是表示兩個(gè)允許不相同的字母
測(cè)試
- (ab)ab就是一個(gè)整體看待,和單獨(dú)的字符串a(chǎn)b沒有區(qū)別
- (?<word>ab)k<word>
把a(bǔ)b這個(gè)組命名為word,然后在后面調(diào)用前面命名的這個(gè)組匹配的字符,即這個(gè)表達(dá)式相當(dāng)于(ab)ab - (?:a)(b)1
前面的組被取消命名,所以自動(dòng)命名從(b)開始,所以后面的1匹配的是(b) - b(?=a)
這個(gè)表達(dá)式的意思是,匹配字符b,這個(gè)字符b的后面緊跟著一個(gè)a
- b(?!a)
這個(gè)表達(dá)式的意思是,匹配字符b,這個(gè)字符b的后面不是a - (?<=a)b
這個(gè)表達(dá)式的意思是,匹配字符b,這個(gè)字符b的前面是a
- (?<!a)b
這個(gè)表達(dá)式的意思是,匹配字符b,這個(gè)字符b的前面不是a - (?>a)b
參考
總結(jié)
以上是生活随笔為你收集整理的使用正则把数字前面的符号替换_正则表达式(一) 基本表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 射频通路 隔直_2.4G射频双向功放电路
- 下一篇: 全国高校计算机考试用的什么版本,全国高校