java正则表达式的菜鸟使用分析
學(xué)習(xí)這個東西,菜鳥主要參考的是這兩篇文章:Java正則多字符串匹配替換(網(wǎng)址:http://www.jb51.net/article/34154.htm)、學(xué)習(xí)正則表達(dá)式:Matcher類(網(wǎng)址:http://www.java3z.com/cwbwebhome/article/article8/81313.html?id=3138)
首先要看懂下面的符號的意思
[...] 位于括號之內(nèi)的任意字符
[^...] 不在括號之中的任意字符
. 除了換行符之外的任意字符,等價于[^\n]
\w 任何單字字符, 等價于[a-zA-Z0-9]
\W 任何非單字字符,等價于[^a-zA-Z0-9]
\s 任何空白符,等價于[\ t \ n \ r \ f \ v]
\S 任何非空白符,等價于[^\ t \ n \ r \ f \ v]
\d 任何數(shù)字,等價于[0-9]
\D 除了數(shù)字之外的任何字符,等價于[^0-9]
[\b] 一個退格直接量(特例)
?
{n, m} 匹配前一項至少n次,但是不能超過m次
{n, } 匹配前一項n次,或者多次
{n} 匹配前一項恰好n次
? 匹配前一項0次或1次,也就是說前一項是可選的. 等價于 {0, 1}
+ 匹配前一項1次或多次,等價于{1,}
* 匹配前一項0次或多次.等價于{0,}
?
| 選擇.匹配的要么是該符號左邊的子表達(dá)式,要么它右邊的子表達(dá)式
(...) 分組.將幾個項目分為一個單元.這個單元可由 *、+、?和|等符號使用,而且還可以記住和這個組匹配的字符以供此后引用使用
\n 和第n個分組所匹配的字符相匹配.分組是括號中的子表達(dá)式(可能是嵌套的).分組號是從左到右計數(shù)的左括號數(shù)
?
^ 匹配的是字符的開頭,在多行檢索中,匹配的是一行的開頭
$ 匹配的是字符的結(jié)尾,在多行檢索中,匹配的是一行的結(jié)尾
\b 匹配的是一個詞語的邊界.簡而言之就是位于字符\w 和 \w之間的位置(注意:[\b]匹配的是退格符)
\B 匹配的是非詞語的邊界的字符
Matcher類有個非常重要的概念叫做:組(Group)
例如:\w(\d\d)(w+)
這個正則表達(dá)式中是用()來劃分組的:
第0組:不看括號,這個的表達(dá)式就是0組\w(\d\d)(w+)
第1組:(\d\d)
第2組:(\w+)
然后來做做例子:(為了使\是有效的所以要用\\放在字符串中)
1 import java.util.regex.Matcher; 2 import java.util.regex.Pattern; 3 4 public class Calender { 5 public static void main(String[] args) { 6 Pattern p = Pattern.compile("(\\d\\d)\\1");//第一組是(\\d\\d)表示2個任何數(shù)字,而后面的\1表示后面的兩個數(shù)要和前面兩個一樣 7 String s = "1212";//可以改成2525之類的前兩個和后兩個相同的數(shù)字,但不能改成1213這樣的(12和13不同) 8 Matcher m = p.matcher(s);//若是Pattern.compile("(\\d(\\d))\\2")則需改成122才對 9 if(m.find()){ 10 int gc = m.groupCount(); 11 for(int i = 0; i <= gc; i++) 12 System.out.println("group " + i + " :" + m.group(i)); 13 } 14 } 15 16 }
輸出結(jié)果為:
group 0 :1212
group 1 :12
現(xiàn)在來試一個驗證郵箱的有效性的例子:
1 import java.util.regex.Matcher; 2 import java.util.regex.Pattern; 3 4 public class Calender { 5 public static void main(String[] args) { 6 /** 7 * ^要以字符為開頭才能匹配 8 * 第一組:([a-z0-9_\\.\\-\\+]+)---a-z或0-9或_或.或-或+都可以匹配 9 * 第二組:([\\da-z\\.\\-]+)---數(shù)字或a-z或.或-都可以匹配 10 * 第三組:([a-z\\.]{2,6})---a-z或.匹配最少2次最多6次 11 * $要以字符為結(jié)尾才能匹配 12 */ 13 Pattern p = Pattern.compile("^([a-z0-9_\\.\\-\\+]+)@([\\da-z\\.\\-]+)\\.([a-z\\.]{2,6})$"); 14 String s = "test_-.+@qq.163.sina.com"; 15 Matcher m = p.matcher(s); 16 if(m.find()){ 17 int gc = m.groupCount(); 18 for(int i = 0; i <= gc; i++) 19 System.out.println("group " + i + " :" + m.group(i)); 20 } 21 } 22 }?
輸出結(jié)果為:
group 0 :test_-.+@qq.163.sina.com
group 1 :test_-.+
group 2 :qq.163.sina
group 3 :com
又來試試?yán)?#xff1a;
1 import java.util.regex.Matcher; 2 import java.util.regex.Pattern; 3 4 public class Calender { 5 public static void main(String[] args) { 6 /** 7 * 第一組:(name|value)---選擇name如果沒有則選擇value 8 * \"---引號 9 * 第二組:(.+?)---.表示匹配除了換行符之外任意字符、+表示匹配前一項1或n次、?表示匹配前一項0或1次(表示前一項可選) 10 * 如果只是(.+)沒有?則它一直要到第四個引號前才會停止 11 * 如果只是(.?)沒有+則name的值必須是一個或零個字符的 12 * 不要把(.+?)理解成單純的符號了 13 */ 14 Pattern p = Pattern.compile("android:(name|value)=\"(.+?)\""); 15 String s = "<meta-data android:name=\"appid\" android:value=\"joy\"></meta-data>"; 16 Matcher m = p.matcher(s); 17 if(m.find()){ 18 int gc = m.groupCount(); 19 for(int i = 0; i <= gc; i++) 20 System.out.println("group " + i + " :" + m.group(i)); 21 } 22 } 23 }輸出結(jié)果:
group 0 :android:name="appid"
group 1 :name
group 2 :appid
上面這個例子菜鳥糾結(jié)蛋疼的試了半天。
警句:菜鳥用爪挖,看者需謹(jǐn)慎,切莫聽一面之詞,徒走曲折之路。
轉(zhuǎn)載于:https://www.cnblogs.com/dadadekongjian/p/3208540.html
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的java正则表达式的菜鸟使用分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转)Linux设备驱动之HID驱动 源
- 下一篇: C#中的WebBrowser控件的使用