求一段正則表達式的代碼
文章目錄
問題描述:
對java的正則表達式對象不熟,特來請教。String s = \"23131http://baidu.com131http://qq.com1231http://taobao.com31231\"
現在想把字元串中的網址提取出來組成一個字元串數組,求代碼,謝謝
網友觀點:
因為你最後是要後去到的是網址 所以沒有必要去用正則表達式 直接用字元串的截取查找就行 而且最後找到放到list裡面去
下面寫的一段看能不能滿足你的要求
package cn.com.wangxiuwei.test;
import java.util.ArrayList;
import java.util.List;
public class TestStr {
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * @param args */ public static void main(String[] args) { List<String> list=new ArrayList<String>(); String str=\\\"23131http://baidu.com131http://qq.com1231http://taobao.com31231\\\"; String strhttp=\\\"http\\\"; String strcom=\\\"com\\\"; int ihttp=0; int icom=0; for(int i=0;i<str.length();i++){ ihttp=str.indexOf(strhttp); icom=str.indexOf(strcom); if(ihttp<0||icom<0){ break; } list.add(str.substring(ihttp, icom+strcom.length())); str=str.substring(icom+strcom.length()); System.out.println(str); } for(int i=0;i<list.size();i++){ System.out.println(list.get(i)+\\\"\\t第\\\"+(i+1)+\\\"網址\\\"); } } |
}
列印結果如下:
131http://qq.com1231http://taobao.com31231
1231http://taobao.com31231
31231
http://baidu.com 第1網址
http://qq.com 第2網址
http://taobao.com 第3網址
正則表達式(一) 基本表達式
定義
正則表達式(Regular Expression)
用某種模式去匹配一類字元串的公式,主要用來描述字元串匹配的工具。
匹配
文本或字元存在不止一個部分滿足給定的正則表達式,這是每一個這樣的部分都被稱為一個匹配。
匹配分為以下三種類型:
- 形容詞性的匹配
即一個字元串匹配一個正則表達式 - 名詞性的匹配
即在文本或字元串里匹配正則表達式 - 名詞性的匹配
即字元串中滿足給定的正則表達式的一部分
元字元
元字元(Metacharacter)是一類非常特殊的字元,它能夠匹配一個位置或字符集合中的一個字元,元字元可以分為兩種類型
- 匹配位置的元字元
- 匹配字元的元字元
元字元只能匹配一個字元位置,也就是一個匹配的單位是一個字元,而不是一個字元串
匹配位置的元字元
測試
^a
匹配第一個字母為a
的一行a$
匹配最後一個字母為a
的一行^a$
匹配只有一個字母a
的一行\\bStr
匹配以Str
為開頭的單詞ing\\b
匹配以ing
為結尾的單詞\\bString\\b
僅匹配String
這個單詞
\\b
字元如何識別哪個是單詞呢?
以標點符號或空格分隔的字元串將被識別為單詞,而且 \\b
只能用於英文,不能用於中文
匹配字元的元字元
元字元都是按照單個字元進行匹配
測試
.
全部字元匹配\\w
匹配了全部的單詞字元,除了下劃線之外的標點符號和漢字都被排除在外\\W
匹配結果和\\w剛好相反,注意那個下劃線是屬於單詞字元的\\s
有2個空格被匹配,注意!這裡總共有6個符號被匹配了,除了兩個空格還有1~4行末的換行符\\S
除了2個空格和4個換行符,其餘字元全部匹配\\d
匹配所有的數字\\D
匹配所有數字之外的字元
元字元組合
僅僅是元字元就可以自由組合來實現不同的匹配效果
\\w\\w
匹配連續的兩個單詞字元\\w\\s
注意第三行最後匹配的m
是和行末的換行符一起匹配成功的
文字匹配
字元類
字元類是一個字符集合,如果該字符集合中的任何一個字元被匹配,則它會找到該匹配項。
[]
字元類使用中括弧作為標誌,字符集合寫在中括弧裡面,意為匹配中括弧中的任意一個字元\\-
- 當
\\-
符號不是第一個字元的時候表示定義字元的範圍*,例如[1-3]
表示[123]
,[a-z]
表示匹配任意小寫字母,如果\\-
放在第一位,那就僅表示自己,這個範圍的順序和兩個字元間的內容是按照ASCII表的順序決定的,例如[9-1]
是違反ASCII表順序的一個表達式,這會報錯 ^
如果放在字元類第一個,表示該字元類的否定,[^123]
表示匹配1、2、3之外的所有數字- 元字元在字元類中不做任何特殊處理,僅僅表示他們自身
測試
[aeiou]
匹配母音字母[a-z]
匹配從小寫字母a
到z
之間的所有字母[^aeiou]
匹配母音字母之外的所有字元(包括任意符號)[^a-z]
匹配小寫字母a
到z
之間的所有字母之外的所有字元[0-9]
匹配從0
到9
之間的任意一個數字[ao-u]
匹配a
和o
到u
之間的所有字母,可以看到只要在連個字元之間使用連接符-
就會判斷為一個區間[!-?]
匹配從!
到?
之間的任意一個符號,可以看到因為是按照ASCII表順序來判斷-
連接的字符集合,所以這樣寫也是沒有問題的[a^-]
匹配字元a
、^
和-
三個字元,只要^
符號不在第一位,-
符號不在兩個字元中間,那麼它們就只表示自身a[no]
匹配字元串an
或ao
,這是字元類和元字元的組合
字元轉義
之前介紹的元字元非常好用,但是這又引出了一個問題,如果我們想在正常的表達式裡面使用元字元本身這個符號怎麼辦呢?難道每次都要寫在字元類裡面嗎?
當然不,這裡就引出了我們的字元轉義
正則表達式定義了一些特殊的元字元,如^
、$
、.
等。由於這些字元在正則表達式中被解釋成其他指定的含義,如果需要匹配這些字元,則需要使用字元轉義來解決這個問題。轉義字元使用符號\\
(反斜杠),它可以取消這些字元(如^
、$
、.
等)在表達式中具有的特殊意義。
.
匹配字元.
*
匹配字元*
\\
匹配字元\\
www\\.lanyuanxiaoyao\\.com
匹配字元串www\\.lanyuanxiaoyao\\.com
,網址中的dot符號也是需要轉義的
常用轉義字元
限定符
這是一個重要的知識點
限定符用於指定允許特定字元或字符集自身重複出現的次數。
測試
a{3}
a{2,}
a{2,3}
ab+
ab?
ab*
ab+?
ab??
ab*?
貪婪模式與懶惰模式
如果在限定符*
、+
、?
、{n}
、{n,}
和{n,m}
之後再添加一個字元 ?
,則表示 儘可能少地重複字元?
之前的限定符號的重複次數,這種匹配方式稱為懶惰匹配,與之相對的,如果沒有字元 ?
,僅僅使用單個限定符*
、+
、?
、{n}
、{n,}
和{n,m}
的匹配,就稱為貪婪匹配。
看起來好像很複雜,但是理解歷來並不難,即懶惰匹配模式只匹配最短符合表達式的字元串,貪婪匹配模式只匹配最長符合表達式的字元串。
這裡的貪婪模式和懶惰模式在不同的教程或者說明裡面都有不同的叫法,所以可以理解意思就行了,大同小異
測試
- 貪婪模式
a.*b
可以看到這裡只有一個匹配,就是整個字元串,因為這是最長的匹配 - 懶惰模式
a.?b
這裡一旦發現一個匹配立刻就完成當前的匹配,然後從下一個字元開始新的匹配,所以這裡會有4個匹配
字元的運算
替換
替換使用字元|
來表示,表示如果某一個字元串匹配了表達式中字元|
左邊或者右邊的規則,那麼這個字元串就匹配了這個表達式|
表示「或」的意思,這個符號和代碼中的「邏輯或」相同,比較好理解
匹配是根據左邊優先的原則,即從左往右,當左邊的表達式不滿足的時候,才會去嘗試右邊的表達式
測試
a|b
可以看到不管是字元a
還是b
都可以匹配這個表達式,它等同於[ab]
分組
分組又被稱為子表達式,即把一個正則表達式的全部或部分分成一個或多個組,分組使用()
來表示,括弧中的表達式就是一個組,一個組就是一個整體
要注意和字元類[]
區分開來,[123]
是表示匹配字元1
或2
或3
,而(123)
就是匹配123
這個字元串
反向引用
組號
當一個正則表達式被分組之後,默認從左到右每一個分組都會自動被賦予一個組號,以左括弧(
為分界從1開始自增,第一個組的組號是1,第二個組的組號是2,以此類推,在後面的表達式,使用\\組號
的方式來引用前面的組,例如\\b(\\w)\\1\\b
這個表達式中,後面的\\1
就是對前面(\\w)
組的引用
自定義組號
分組不止會自動使用數字作為組號,還可以手動命名,形式為(?<name>)
,(?<word>\\w)
和(?'word'\\w)
都是把\\w+
匹配到的字母保存到名為word
的分組,自定義命名的分組使用\\k<name>
的方式使用 ,如\\b(?<word>\\w)\\k<word>\\b
是匹配連續的相同的兩個字母的單詞
反向引用
提供了查找重複字元組的簡便方法,可以認為是再次匹配同一個字元組的快捷指令
反向引用引用的是前面的表達式匹配到的字元串,而不是前面的表達式
例如,\\b(\\w)\\1\\b
這個表達式中的\\1
表示的是前面\\w
匹配到的字元,前面匹配到字母a
那麼\\1
處也必須替換為字母a
,而不是任意一個字母 所以這個表達式匹配的是兩個完全相同的字母 而如果是\\b(\\w)\\w\\b 則是表示兩個允許不相同的字母
測試
(ab)
ab
就是一個整體看待,和單獨的字元串ab
沒有區別(?<word>ab)\\k<word>
把ab
這個組命名為word
,然後在後面調用前面命名的這個組匹配的字元,即這個表達式相當於(ab)ab
(?:a)(b)\\1
前面的組被取消命名,所以自動命名從(b)
開始,所以後面的\\1
匹配的是(b)
b(?=a)
這個表達式的意思是,匹配字元b
,這個字元b
的後面緊跟著一個a
b(?!a)
這個表達式的意思是,匹配字元b
,這個字元b
的後面不是a
(?<=a)b
這個表達式的意思是,匹配字元b
,這個字元b
的前面是a
(?<!a)b
這個表達式的意思是,匹配字元b
,這個字元b
的前面不是a
(?>a)b
參考
- 王蕾. 神奇的匹配 正則表達式求精之旅[M]. 北京:電子工業出版社, 2014.
- 文中使用的正則表達式測試工具:正則表達式測試工具在線調試與分享-Zjmainstay
- 文中使用的正則表達式可視化生成工具:Regulex JavaScript Regular Expression Visualizer.
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » 求一段正則表達式的代碼