每種語言對正則表達式有不同的使用方式,不管是匹配還是替換,不管哪種語言正則表達式的寫法都是一樣的。
一、正則表示的基礎語法
正則表達式使用時,會將一個字符串和一個固定的模式進行匹配,這個模式就是正則表達式。
正則表達式可以是一個固定的字符串,如:“abcd”,這樣的表達式,就會依次匹配a、b、c、d,按照不同的匹配模式,會進行全部匹配或在字符串中查找子串。
但是,一般正則表達式回去匹配一個固定模式的一類字符串,如郵箱,這需要一些特殊語法。
1、[]字符集合
字符集合是一些字符的集合,可以同&&[],來創造集合和集合的交集。
需要注意的是,一個[]集合在正則表達式中只代表一個字符的匹配,匹配多字符需要數量的修飾符。
[abc] 只有abc 3個字符的集合
[a-z] 有a到z 26個字符的集合
[^a-z] 除了a到z的其他所有字符的集合,^符號寫在[]里是補集的意思,但它另有其他含義。
[a-z&&[^a-c]] 除了abc外的其他所有小寫的字母
[a-zA-Z0-9@!#] 小寫所有字母,大寫所有字母,所有數字,加上@!#的字符的集合。
2、預定義字符集
一些規定好的字符集,相當於一個[]
. 任意一個字符
\d 任意一個數字,相當於[0-9]
\w 任意一個單詞字符,相當於[a-zA-Z0-9]
\s 任意一個空白字符,如:空格、換行、轉義等,相當於[\t\n\x0B\f\r]
\D 非數字
\W 非單詞字符
\S 非空白字符
3、數量詞
數量詞跟在正則表達式的某個字符或集合、分組之后,表示該單位匹配的數量,如:a*,匹配0到任意多個字符。
a? 表示0個或1個a
a* 表示0個或任意多個a
a+ 表示1個到任意多個a
a{n} 表示n個a
a{n,} 表示n到任意多個a
a{n,m} 表示n到m個a
用法: a?
[agc]? \d?
(/d[agc])?
4、分組()
()表示將一段正則表達式看出一個整體,()內可以使用|表示或。
分組意義在意,將幾個字符組成一個整體,可以對他進行數量詞修飾。
例(one|two)? 表示連續的one或two,存在一次或不存在。
5、^和&符號
如:^a\\d{3}b&
該正則表達式表示匹配,以a開頭,后有三個數字,並以b結尾的字符串。
需要注意的是,^&是用在匹配上的,使用之后匹配的整個字符串,而非子串。替換和拆分的語法不使用該字符。
個人覺得在java的函數中使用效果不是很好,暫時沒有找到必須使用的案例。
6、關於字符轉義的注意事項。
當不涉及編程語言,只考慮正則表達式內的轉義時。當需要使用那些已經被正則表達式使用並賦予特殊含義的字符原本的含義時,需要使用轉義符。
如:需要匹配?時,正則表達式應該:\?
\的正則應是:\\
大致有這些:
\ \\
? \?
* \*
+ \+
. \.
() \(\)
[] \[\]
{} \{\}
^ \^
$ \$
關於:&&字符寫在[]外,沒有任何影響,寫在[]里面時,只能單個&使用,&&使用時是做交集的操作。&&后為空,對集合無影響。
在java中的轉義:
將在正則中的所有使用的\轉義成\\
如[\d]+ 轉義成:[\\d]+
\\ 轉義成:\\\\
二、正則表達式在不同語言中的使用
1、在java中的使用。
使用String類型自帶的函數:
matches()方法:對整個字符串進行匹配,符合匹配返回true,不符合返回false。
String str = "abc123!@#"; String regex1 = "[\\w!@#]+"; String regex2 = "[\\w]+"; System.out.println(str.matches(regex1)); //true System.out.println(str.matches(regex2)); //false
split(),拆分方法,返回一個字符串的數組。
String str = "www.baidu.com"; String regex1 = "\\."; String[] splitStrs = str.split(regex1); System.out.println(Arrays.toString(splitStrs)); //[www, baidu, com]
replaceAll(),把字符串中所有滿足表達式的子串替換掉。
String str = "abc123abc456abc"; String regex1 = "abc"; String replaceAll = str.replaceAll(regex1,"***"); System.out.println(replaceAll); //***123***456***
還有一個replaceFirst(),同樣的用法,只是只替換第一個子串。
使用Pattern的相關類:
關於匹配的方法:三個方法都返回boolean值。
matches() 匹配整個字符串
find() 查找是否有子串
lookingAt() 從第一字符匹配子串
Pattern pattern = Pattern.compile("[\\d]{3}");//使用正則表達式創建Pattern
Matcher matcher = pattern.matcher("abc123dgh");//創建給的字符串的匹配器
boolean result1 = matcher.matches();//false
boolean result2 = matcher.find();//true
boolean result3 = matcher.lookingAt();//false