java的正則表達(dá)式

正則表達(dá)

參考
正則表達(dá)式的一個
參考2

限定符

常用的限定符 方式
* 匹配前面的子表達(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)容

詳細(xì)介紹java正則

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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.正則表達(dá)式介紹 正則表達(dá)式算起來也是一個很龐大的語言系統(tǒng),在所有的開發(fā)語言中基本都支持正則表達(dá)式,它可以很方便...
    babybus_superdo閱讀 2,670評論 3 6
  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,197評論 0 13
  • 原文地址 之前在http://shukuiyan.iteye.com/blog/507915文中已經(jīng)敘述過這個問題...
    hmaccelerate閱讀 973評論 0 1
  • 清明節(jié)的前一晚散步的時候在微信里和一米聊了幾句,兩個人約定第二天去開封溜達(dá)一圈,然后我繼續(xù)走我的路,她則回家搜一下...
    林雅閱讀 624評論 1 4
  • 你跨越光年之遠(yuǎn) 在暗夜里流浪 我見你時 暗淡如你 我轉(zhuǎn)身離去 各生歡喜
    a32b0dfe39b2閱讀 158評論 0 0

友情鏈接更多精彩內(nèi)容