正則表達(dá)
限定符
| 常用的限定符 | 方式 |
|---|---|
| * | 匹配前面的子表達(dá)式零次或多次 |
| + | 匹配前面的子表達(dá)式一次或多次。 |
| ? | 匹配前面的子表達(dá)式零次或一次。 |
| {n} | n 是一個非負(fù)整數(shù)。匹配確定的 n 次 |
| {n,} | n 是一個非負(fù)整數(shù)。至少匹配n 次。 |
| {n,m} | m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次 |
常用這個代替 x*,零次或多次 ≡{0,} {n,m}表示前面的最少n次最多m次
定位符
| 常用的定位符 | 方式 |
|---|---|
| ^ | 匹配輸入字符串開始的位置 |
| $ | 匹配輸入字符串結(jié)尾的位置。 |
| \b | 匹配一個字邊界,即字與空格間的位置,常用來表示一個單詞 |
| \B | 非字邊界匹配。 |
\b 字符的位置是非常重要的。如果它位于要匹配的字符串的開始,它在單詞的開始處查找匹配項。如果它位于字符串的結(jié)尾,它在單詞的結(jié)尾處查找匹配項
Chapter 的開頭三個字符: \bCha
匹配單詞 Chapter 中的字符串 ter :ter\b
元字符 參考
| 常用的元字符 | 方式 |
|---|---|
| \b | 與一個字邊界匹配;即字與空格間的位置。 |
| \B | |
| \d | 數(shù)字字符匹配相當(dāng)于[0-9] |
| \D | 等效于 [^0-9] |
| \w | 等效于 [A-Za-z0-9_,與以下任意字符匹配:A-Z、a-z、0-9 和下劃線] |
| \ W | 等效于 [^A-Za-z0-9_],與除 A-Z、a-z、0-9 和下劃線以外的任意字符匹配。] |
| [xyz] | [abc] 與“plain”中的“a”匹配,字符集,與任何一個指定字符匹配。 |
反向引用,類似于java正則中的group(1),便是正則第一個括號中的值
正則的表示是用 \數(shù)字 :\1
大小寫是否區(qū)分
| 常用的元字符 | 方式 |
|---|---|
| (?!) | 不區(qū)分大小寫sensitive(?!)caseless(?!)sensitive可匹配sensitiveCaSelessSENsentive |
| (?-i) | 關(guān)閉不區(qū)分大小寫,sensitive(?-!)caseless(?-!)sensitive只能匹配sensitivecaselesssensitive |
通過舉例子的方式來表達(dá)
需要轉(zhuǎn)移的字符總結(jié)
實際操作
1、\| :兩個\后面加|,表示匹配一個|,|屬于元字符,java中\(zhòng)本身具有轉(zhuǎn)義作用,則兩次,在java中相當(dāng)于前一個\是給后一個\轉(zhuǎn)意的,然后在用\對|轉(zhuǎn)意
2、[0-9]{1,} :表示數(shù)字 某位置上出現(xiàn)0-9上的數(shù)字,至少1次,{n,m},表示前面的至少出現(xiàn)n次最多m次
3、() : 表示一個子表達(dá)式的開始和結(jié)束,例如(\(\?:第)([1-9]{1,})(段\)\?),中(\?:第),這是一個子表達(dá)式, ([1-9]{1,})這是一個子表達(dá)式,(段\)這是一個子表達(dá)式
4、 . :匹配換行符\n之外的任何單字符、
5、^ :在方括號外,表示字符串開始位置,在方括號內(nèi)表示非的意思
6、| :或運(yùn)算
7、章節(jié)的表示 : [1-9][0-9]*
8、 .* : .表示匹配任何單字符 *表示匹配前面的字符出現(xiàn)0次到多次
9、匹配一行文本的結(jié)束處的文本,請在正則表達(dá)式的結(jié)束處使用 $ 字符:Chapter [1-9][0-9]{0,1}$
10、若要匹配一行文本開始處的文本,請在正則表達(dá)式的開始使用 ^ 字符: ^Chapter [1-9][0-9]{0,1}
11、匹配單詞 Chapter 的開頭三個字符,因為這三個字符出現(xiàn)字邊界后面: \bCha
java編寫正則的過程
1、寫一個特殊的字符串——正則表達(dá)式如a|f。
String reg1="(\$underscore[0-9]{1,}\$)|(\$bracket[1-9]{1,}\$)";
2、將正則表達(dá)式編譯成一個模板:p
Pattern pattern = Pattern.compile(reg1);
3、用模板p去匹配字符串str。
Matcher matcher=pattern.matcher(str);]
4、之后拿著這個match可以做操作
match.find()配合appendReplacement(StringBuffer sb,string replace)迭代的方式替換原來的值
或 match.replaceFirst( string)
或match.replaceAll(string s)
或者match.find()配合match.group(int i) 迭代的取出每次匹配到的值i=0表示整個,i=1表示正則表達(dá)式(1)(2)(3)1所括起來的值
詳細(xì)內(nèi)容
Pattern對象
1、Pattern對象表示經(jīng)編譯的正則表達(dá)式,靜態(tài)的compile( )方法負(fù)責(zé)將表示正則表達(dá)式的字符串編譯成Pattern對象Pattern pattern = Pattern.compile(string regx)
2、Pattern還有一個能快速判斷能否在input里面找到regex的 static boolean matches(string regex, String input)
3、以及能返回String數(shù)組的split( )方法,它能用regex把字符串分割開來,這個要查看一下
4、Pattern Pattern.compile(String regex, int flag),這個方法后面有個flag是對正則表達(dá)式進(jìn)一步加強(qiáng)表達(dá)
| flag取值 | 作用 |
|---|---|
| Pattern.CANON_EQ | |
| Pattern.CASE_INSENSITIVE | 這個標(biāo)志能讓表達(dá)式忽略大小寫進(jìn)行匹配 |
| Pattern.COMMENTS | 匹配時會忽略(正則表達(dá)式里的)空格字符 |
| Pattern.DOTALL | 在這種模式下,表達(dá)式'.'可以匹配任意字符,包括表示一行的結(jié)束符。默認(rèn)情況下,表達(dá)式'.'不匹配行的結(jié)束符。 |
| Pattern.MULTILINE | 在這種模式下,''和'$'分別匹配一行的開始和結(jié)束。此外,''仍然匹配字符串的開始,'$'也匹配字符串的結(jié)束。 |
| Pattern.UNICODE_CASE | 在這個模式下,如果你還啟用了CASE_INSENSITIVE標(biāo)志,那么它會對Unicode字符進(jìn)行大小寫不明感的匹配。默認(rèn)情況下,大小寫不明感的匹配只適用于US-ASCII字符集。 |
| Pattern.UNIX_LINES | 在這個模式下,只有'/n'才被認(rèn)作一行的中止,并且與'.','^',以及'$'進(jìn)行匹配。 |
Matcher對象,只要給Pattern.matcher(string regx )方法傳一個字符串
1、boolean matches()
2、boolean lookingAt(),lookingAt( )的意思是Pattern匹配字符串的開頭
3、boolean find(),的功能是發(fā)現(xiàn)CharSequence里的,與pattern相匹配的多個字符序列,find( )像一個迭代器.從頭到尾掃描一遍字符串.
4、boolean find(int start),find( )是帶int參數(shù)的,正如你所看到的,它會告訴方法從哪里開始找
5、String group(),Group是指里用括號括起來的,能被后面的表達(dá)式調(diào)用的正則表達(dá)式,Group 0 表示整個表達(dá)式,group 1表示第一個被括起來的group
find()可以看做遞歸,及從sourceString中查找查找符合正則表達(dá)式的stirng,然后group函數(shù)則顯示這個值group(0)表示這個值,group(1)表示正則表達(dá)式用()括起來的第一個值
6、reset( )相當(dāng)于給find()重新跳一個指針到頭上去。 假若下面程序不reset()則第二個while沒得輸出
while(matcher.find()){
System.out.println(matcher.group());
}
matcher.reset();
while (matcher.find()) {
System.out.println("進(jìn)來"+matcher.group());
}
要記得String類型有個replace方法,可以逐個的替換值replace(matcher.group(0), matcher.group(2)),用著個和java的正則結(jié)合起來用
替換操作
替換操作三種可選方法
1、replaceFirst(String replacement)將字符串里,第一個與模式相匹配的子串替換成replacement。
2、replaceAll(String replacement),將輸入字符串里所有與模式相匹配的子串全部替換成replacement。
3、appendReplacement(StringBuffer sbuf, String replacement),一般這個要配合match.find()函數(shù)來一個
//替換第一次匹配到的(?:第1段)?為xxxx
String source="判斷$bracket0$中(?:第1段)?運(yùn)用了$bracket1$$underscore0$分析$bracket0$的本質(zhì)(?:第2段)?(?:第3段)?";
//在正則加的()()()后面用來group(1),group(2),group(3)的
String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
Pattern pattern = Pattern.compile(reg);
Matcher matcher=pattern.matcher(source);
String resultTemp1=matcher.replaceFirst("xxxx");
System.out.println(resultTemp1);
//替換匹配到的(?:第1段)?為xxxx
String source="判斷$bracket0$中(?:第1段)?運(yùn)用了$bracket1$$underscore0$分析$bracket0$的本質(zhì)(?:第2段)?(?:第3段)?";
//在正則加的()()()后面用來group(1),group(2),group(3)的
String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
Pattern pattern = Pattern.compile(reg);
Matcher matcher=pattern.matcher(source);
String resultTemp1=matcher.replaceAll("xxxx");
System.out.println(resultTemp1);
//取出匹配到的(?:第1段),中的數(shù)字,并替換掉原來的(?:第1段)
String source="判斷$bracket0$中(?:第1段)?運(yùn)用了$bracket1$$underscore0$分析$bracket0$的本質(zhì)(?:第2段)?(?:第3段)?";
//在正則加的()()()后面用來group(1),group(2),group(3)的
String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
Pattern pattern = Pattern.compile(reg);
Matcher matcher=pattern.matcher(source);
StringBuffer stringBuffer=new StringBuffer();
//find遞歸
while(matcher.find()){
matcher.appendReplacement(stringBuffer, matcher.group(2));//正則表達(dá)式reg,第二個(),括起來的內(nèi)容
}
System.out.println(stringBuffer.toString());
或者
String source="判斷$bracket0$中(?:第1段)?運(yùn)用了$bracket1$$underscore0$分析$bracket0$的本質(zhì)(?:第2段)?(?:第3段)?";
//在正則加的()()()后面用來group(1),group(2),group(3)的
String reg="(\\(\\?:第)([1-9]{1,})(段\\)\\?)";
Pattern pattern = Pattern.compile(reg);
Matcher matcher=pattern.matcher(source);
String string=null;
//find遞歸
while(matcher.find()){
string="("+matcher.group(2)+")";
//利用String的類來做的replace,替換
source=source.replace(matcher.group(0), string);
}
System.out.println(source);