正則表達
限定符
常用的限定符 | 方式 |
---|---|
* | 匹配前面的子表達式零次或多次 |
+ | 匹配前面的子表達式一次或多次饶氏。 |
? | 匹配前面的子表達式零次或一次蔼卡。 |
{n} | n 是一個非負整數(shù)塘砸。匹配確定的 n 次 |
{n,} | n 是一個非負整數(shù)。至少匹配n 次。 |
{n,m} | m 和 n 均為非負整數(shù)北救,其中n <= m淀零。最少匹配 n 次且最多匹配 m 次 |
常用這個代替 x*,零次或多次 ≡{0,} {n膛壹,m}
表示前面的最少n次最多m次
定位符
常用的定位符 | 方式 |
---|---|
^ | 匹配輸入字符串開始的位置 |
$ | 匹配輸入字符串結尾的位置驾中。 |
\b | 匹配一個字邊界,即字與空格間的位置,常用來表示一個單詞 |
\B | 非字邊界匹配模聋。 |
\b 字符的位置是非常重要的肩民。如果它位于要匹配的字符串的開始,它在單詞的開始處查找匹配項链方。如果它位于字符串的結尾持痰,它在單詞的結尾處查找匹配項
Chapter 的開頭三個字符: \bCha
匹配單詞 Chapter 中的字符串 ter :ter\b
元字符 參考
常用的元字符 | 方式 |
---|---|
\b | 與一個字邊界匹配;即字與空格間的位置祟蚀。 |
\B | |
\d | 數(shù)字字符匹配相當于[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) | 關閉不區(qū)分大小寫,sensitive(?-!)caseless(?-!)sensitive只能匹配sensitivecaselesssensitive |
通過舉例子的方式來表達
需要轉移的字符總結
實際操作
1匀借、\| :兩個\后面加|颜阐,表示匹配一個|,|屬于元字符吓肋,java中\(zhòng)本身具有轉義作用凳怨,則兩次,在java中相當于前一個\是給后一個\轉意的,然后在用\對|轉意
2是鬼、[0-9]{1,} :表示數(shù)字 某位置上出現(xiàn)0-9上的數(shù)字猿棉,至少1次,{n,m},表示前面的至少出現(xiàn)n次最多m次
3屑咳、() : 表示一個子表達式的開始和結束,例如(\(\?:第)([1-9]{1,})(段\)\?)弊琴,中(\?:第)兆龙,這是一個子表達式, ([1-9]{1,})這是一個子表達式敲董,(段\)這是一個子表達式
4紫皇、 . :匹配換行符\n之外的任何單字符、
5腋寨、^ :在方括號外聪铺,表示字符串開始位置,在方括號內(nèi)表示非
的意思
6萄窜、| :或運算
7铃剔、章節(jié)的表示 : [1-9][0-9]*
8、 .* : .表示匹配任何單字符 *表示匹配前面的字符出現(xiàn)0次到多次
9查刻、匹配一行文本的結束處的文本键兜,請在正則表達式的結束處使用 $ 字符:Chapter [1-9][0-9]{0,1}$
10、若要匹配一行文本開始處的文本穗泵,請在正則表達式的開始使用 ^ 字符: ^Chapter [1-9][0-9]{0,1}
11普气、匹配單詞 Chapter 的開頭三個字符,因為這三個字符出現(xiàn)字邊界后面: \bCha
java編寫正則的過程
1佃延、寫一個特殊的字符串——正則表達式如a|f现诀。
String reg1="(\$underscore[0-9]{1,}\$)|(\$bracket[1-9]{1,}\$)";
2夷磕、將正則表達式編譯成一個模板: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表示正則表達式(1)(2)(3)1所括起來的值
詳細內(nèi)容
Pattern對象
1于未、Pattern對象表示經(jīng)編譯的正則表達式撕攒,靜態(tài)的compile( )方法負責將表示正則表達式的字符串編譯成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是對正則表達式進一步加強表達
flag取值 | 作用 |
---|---|
Pattern.CANON_EQ | |
Pattern.CASE_INSENSITIVE | 這個標志能讓表達式忽略大小寫進行匹配 |
Pattern.COMMENTS | 匹配時會忽略(正則表達式里的)空格字符 |
Pattern.DOTALL | 在這種模式下,表達式'.'可以匹配任意字符握侧,包括表示一行的結束符蚯瞧。默認情況下,表達式'.'不匹配行的結束符品擎。 |
Pattern.MULTILINE | 在這種模式下埋合,''和'$'分別匹配一行的開始和結束。此外萄传,''仍然匹配字符串的開始甚颂,'$'也匹配字符串的結束。 |
Pattern.UNICODE_CASE | 在這個模式下秀菱,如果你還啟用了CASE_INSENSITIVE標志振诬,那么它會對Unicode字符進行大小寫不明感的匹配。默認情況下衍菱,大小寫不明感的匹配只適用于US-ASCII字符集赶么。 |
Pattern.UNIX_LINES | 在這個模式下,只有'/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是指里用括號括起來的,能被后面的表達式調(diào)用的正則表達式很钓,Group 0 表示整個表達式香府,group 1表示第一個被括起來的group
find()可以看做遞歸,及從sourceString中查找查找符合正則表達式的stirng码倦,然后group函數(shù)則顯示這個值group(0)表示這個值企孩,group(1)表示正則表達式用()括起來的第一個值
6、reset( )相當于給find()重新跳一個指針到頭上去袁稽。 假若下面程序不reset()則第二個while沒得輸出
while(matcher.find()){
System.out.println(matcher.group());
}
matcher.reset();
while (matcher.find()) {
System.out.println("進來"+matcher.group());
}
要記得String類型有個replace方法勿璃,可以逐個的替換值replace(matcher.group(0), matcher.group(2)),用著個和java的正則結合起來用
替換操作
替換操作三種可選方法
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段)?運用了$bracket1$$underscore0$分析$bracket0$的本質(?:第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段)?運用了$bracket1$$underscore0$分析$bracket0$的本質(?:第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段)?運用了$bracket1$$underscore0$分析$bracket0$的本質(?:第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));//正則表達式reg,第二個()早直,括起來的內(nèi)容
}
System.out.println(stringBuffer.toString());
或者
String source="判斷$bracket0$中(?:第1段)?運用了$bracket1$$underscore0$分析$bracket0$的本質(?:第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);