Java正則表達(dá)式方法

一、什么是正則表達(dá)式订晌?

正則表達(dá)式是一種可以用于模式匹配和替換的規(guī)范虏辫。

一個(gè)正則表達(dá)式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)組成的文字模式。

它用以描述在查找文字主體時(shí)待匹配的一個(gè)或多個(gè)字符串锈拨。

正則表達(dá)式作為一個(gè)模板砌庄,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。

二奕枢、用途

  • 字符串匹配(字符匹配)
  • 字符串查找
  • 字符串替換
  • 字符串分割

三娄昆、Java中處理正則表達(dá)式的類(lèi)

1、java.util.regex.Pattern:模式類(lèi)

字符串要被匹配的一個(gè)模式验辞。也是正則表達(dá)式的編譯表示形式稿黄。該模式本身已經(jīng)被編譯過(guò),使用的話(huà)效率要高很多跌造。

指定為字符串的正則表達(dá)式必須首先被編譯為此類(lèi)的實(shí)例杆怕。然后,可將得到的模式用于創(chuàng)建 Matcher對(duì)象壳贪,依照正則表達(dá)式陵珍,該對(duì)象可以與任意字符序列匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中违施,所以多個(gè)匹配器可以共享同一模式互纯。

典型的調(diào)用順序

Pattern p = Pattern.compile("a*b");  // 將給定的正則表達(dá)式編譯到模式中。
Matcher m = p.matcher("aaaaab"); // 創(chuàng)建匹配給定輸入與此模式的匹配器(Matcher對(duì)象)磕蒲。
boolean b = m.matches(); // 嘗試將整個(gè)區(qū)域與模式匹配留潦。當(dāng)且僅當(dāng)整個(gè)區(qū)域序列匹配此匹配器的模式時(shí)才返回 true只盹。

// 在僅使用一次時(shí),可以更方便地使用matches(String regex, CharSequence input)進(jìn)行匹配
// 對(duì)于重復(fù)的匹配而言它效率不高兔院,因?yàn)樗辉试S重用已編譯的模式殖卑。 
boolean b = Pattern.matches("a*b", "aaaaab");
方法摘要
flags字段摘要

2、java.util.regex.Matcher:匹配類(lèi)

模式匹配某個(gè)字符串所產(chǎn)生的結(jié)果坊萝,這個(gè)結(jié)果可能會(huì)有很多個(gè)孵稽。

它是解釋 Pattern對(duì) character sequence執(zhí)行匹配操作的引擎。

通過(guò)調(diào)用模式的 matcher方法從模式創(chuàng)建匹配器十偶。

(1)匹配方法:matches()菩鲜、find()、lookingAt()

創(chuàng)建匹配器后惦积,可以使用它執(zhí)行三種不同的匹配操作:

  • matches():方法嘗試將整個(gè)輸入序列與該模式匹配接校。當(dāng)且僅當(dāng)整個(gè)區(qū)域序列匹配此匹配器的模式時(shí)才返回 true。

  • lookingAt():嘗試將輸入序列從頭開(kāi)始與該模式匹配荣刑。與matches不同的是馅笙,它不需要匹配整個(gè)區(qū)域伦乔。當(dāng)且僅當(dāng)輸入序列的前綴匹配此匹配器的模式時(shí)才返回 true厉亏。

  • find():方法掃描輸入序列以查找與該模式匹配的下一個(gè)子序列。當(dāng)且僅當(dāng)輸入序列的子序列匹配此匹配器的模式時(shí)才返回 true烈和。

  • find(int start):重置此匹配器爱只,然后嘗試查找匹配該模式、從指定索引開(kāi)始的輸入序列的下一個(gè)子序列招刹。當(dāng)且僅當(dāng)從給定索引開(kāi)始的輸入序列的子序列匹配此匹配器的模式時(shí)才返回 true恬试。

package demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegex {
    public static void main(String[] args) {
        /**
         * matches()
         */
        System.out.println("asdsfdfagf@adsdsfd.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));// true

        Pattern p = Pattern.compile("\\d{3,5}");
        Matcher m = p.matcher("123-34345-234-00");
        // 將整個(gè)"123-34345-234-00"用正則表達(dá)式引擎查找匹配,當(dāng)?shù)降谝粋€(gè)"-"不匹配了疯暑,就停止训柴。但不會(huì)將不匹配的"-"吐出來(lái)
        System.out.println(m.matches());
        // 將不匹配的"-"吐出來(lái)
        m.reset();

        /**
         * 當(dāng)前面是m.matches()時(shí),查找子字符串從"34345-234-00"開(kāi)始
         * 當(dāng)前面是m.matches()和m.reset()時(shí)妇拯,查找子字符串從"123-34345-234-00"開(kāi)始
         */
        System.out.println(m.find());
        System.out.println(m.start() + "---" + m.end());
        System.out.println(m.find());
        System.out.println(m.start() + "---" + m.end());
        System.out.println(m.find());
        System.out.println(m.start() + "---" + m.end());
        System.out.println(m.find());
        // System.out.println(m.start()+"---"+m.end());

        System.out.println(m.lookingAt());
        System.out.println(m.lookingAt());
        System.out.println(m.lookingAt());
        System.out.println(m.lookingAt());
    }
}
運(yùn)行結(jié)果

(2)字符串替換方法:

  • appendReplacement:開(kāi)始搜索幻馁,匹配到就替換。

  • appendTail:在調(diào)用 appendReplacement方法后調(diào)用它來(lái)復(fù)制剩余的輸入序列越锈。

  • replaceAll:替換模式與給定替換字符串相匹配的輸入序列的每個(gè)子序列仗嗦。

package demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串替換
 * 
 * @author xiangdonglee
 *
 */
public class TestRegex2 {
    public static void main(String[] args) {
        // Pattern.CASE_INSENSITIVE:?jiǎn)⒂貌粎^(qū)分大小寫(xiě)的匹配。
        Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher("java Java jAva ILoveJavA youHateJAVA sdofg");
        StringBuffer buf = new StringBuffer();
        int i = 0;
        while (m.find()) {
            i++;
            if (i % 2 == 0) {
                m.appendReplacement(buf, "java");
            } else {
                m.appendReplacement(buf, "JAVA");
            }
        }
        // 不加這句話(huà)甘凭,字符串sdofg將會(huì)被遺棄
        m.appendTail(buf);
        System.out.println(buf);
    }
}
運(yùn)行結(jié)果

(3)分組

  • group():返回由以前匹配操作所匹配的輸入子序列稀拐。

  • group(int group):返回在以前匹配操作期間由給定組捕獲的輸入子序列。

  • groupCount():返回此匹配器模式中的捕獲組數(shù)丹弱。

package demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 分組
 * 
 * @author xiangdonglee
 *
 */
public class TestRegex3 {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");
        String s = "123aa-34345bb-234cc-00";
        Matcher m = p.matcher(s);
        while (m.find()) {
            System.out.println(m.group()); // 數(shù)字德撬、字母都有
            System.out.println(m.group(1)); // 只有數(shù)字
            System.out.println(m.group(2));// 只有字母
        }
    }
}
運(yùn)行結(jié)果

(4)重置匹配器

  • reset():重置匹配器铲咨。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜓洪,隨后出現(xiàn)的幾起案子鸣驱,更是在濱河造成了極大的恐慌,老刑警劉巖蝠咆,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踊东,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刚操,警方通過(guò)查閱死者的電腦和手機(jī)闸翅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)菊霜,“玉大人坚冀,你說(shuō)我怎么就攤上這事〖眩” “怎么了记某?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)构捡。 經(jīng)常有香客問(wèn)我液南,道長(zhǎng),這世上最難降的妖魔是什么勾徽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任滑凉,我火速辦了婚禮,結(jié)果婚禮上喘帚,老公的妹妹穿的比我還像新娘畅姊。我一直安慰自己,他們只是感情好吹由,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布若未。 她就那樣靜靜地躺著,像睡著了一般倾鲫。 火紅的嫁衣襯著肌膚如雪粗合。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天级乍,我揣著相機(jī)與錄音舌劳,去河邊找鬼。 笑死玫荣,一個(gè)胖子當(dāng)著我的面吹牛甚淡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贯卦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼资柔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起撵割,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贿堰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后啡彬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體羹与,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年庶灿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵搁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡往踢,死狀恐怖腾誉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峻呕,我是刑警寧澤利职,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站瘦癌,受9級(jí)特大地震影響猪贪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佩憾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一哮伟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妄帘,春花似錦、人聲如沸池凄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肿仑。三九已至致盟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尤慰,已是汗流浹背馏锡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伟端,地道東北人杯道。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像责蝠,于是被迫代替她去往敵國(guó)和親党巾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萎庭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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