java的正則表達式

正則表達

參考
正則表達式的一個
參考2

限定符

常用的限定符 方式
* 匹配前面的子表達式零次或多次
+ 匹配前面的子表達式一次或多次饶氏。
? 匹配前面的子表達式零次或一次蔼卡。
{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)容

詳細介紹java正則

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);
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霞扬,隨后出現(xiàn)的幾起案子糕韧,更是在濱河造成了極大的恐慌,老刑警劉巖喻圃,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萤彩,死亡現(xiàn)場離奇詭異,居然都是意外死亡斧拍,警方通過查閱死者的電腦和手機雀扶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愚墓,你說我怎么就攤上這事予权。” “怎么了浪册?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我多艇,道長鹅很,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任厚者,我火速辦了婚禮躁劣,結果婚禮上,老公的妹妹穿的比我還像新娘籍救。我一直安慰自己习绢,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布蝙昙。 她就那樣靜靜地躺著闪萄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奇颠。 梳的紋絲不亂的頭發(fā)上败去,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音烈拒,去河邊找鬼圆裕。 笑死,一個胖子當著我的面吹牛荆几,可吹牛的內(nèi)容都是我干的吓妆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吨铸,長吁一口氣:“原來是場噩夢啊……” “哼行拢!你這毒婦竟也來了?” 一聲冷哼從身側響起诞吱,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤舟奠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后房维,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沼瘫,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年咙俩,在試婚紗的時候發(fā)現(xiàn)自己被綠了耿戚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溅话,靈堂內(nèi)的尸體忽然破棺而出晓锻,到底是詐尸還是另有隱情,我是刑警寧澤飞几,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布砚哆,位于F島的核電站,受9級特大地震影響屑墨,放射性物質發(fā)生泄漏躁锁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一卵史、第九天 我趴在偏房一處隱蔽的房頂上張望战转。 院中可真熱鬧,春花似錦以躯、人聲如沸槐秧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刁标。三九已至,卻和暖如春址晕,著一層夾襖步出監(jiān)牢的瞬間膀懈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工谨垃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留启搂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓刘陶,卻偏偏與公主長得像胳赌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匙隔,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

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