Java正則表達(dá)式總結(jié)

基礎(chǔ)

相對(duì)其他語(yǔ)言秩彤,Java對(duì)反斜線\有不同的處理与柑。在其他語(yǔ)言中,\\表示“在正則表達(dá)式中插入普通的反斜線涡戳,所以不要給他任何特殊意義”,而在Java中渔彰,\\表示“插入一個(gè)正則表達(dá)式的反斜線,所以后面的字符具有特殊意義”舔稀。例如乳丰,Java中如果表示一個(gè)數(shù)字,那么正則表達(dá)式是\\d内贮,而其他語(yǔ)言則是\d。

String中的正則表達(dá)式

String中有3個(gè)方法可以使用正則表達(dá)式夜郁,分別是

//判斷字符串是否匹配正則表達(dá)式什燕,匹配返回true屎即,不然返回false
boolean matches(String regex)

//用給定的正則表達(dá)式切割字符串,注意與正則表達(dá)式匹配的部分技俐,在最終結(jié)果中都不存在了
String[] split(String regex)
//限定切割次數(shù)
String[] split(String regex, int limit)

//替換所有匹配到的字符串
String replaceAll(String regex, String replacement)
//替換掉第一個(gè)匹配到的字符串
String replaceFirst(String regex, String replacement)

Pattern和Matcher

導(dǎo)入java.util.regex,然后用static Pattern.compile()方法來(lái)編譯正則表達(dá)式贱勃。他會(huì)根據(jù)String類型的正則表達(dá)式生成一個(gè)Pattern對(duì)象井赌,接下來(lái)把想要檢索的字符串傳入Pattern對(duì)象的matcher()方法,matcher()方法會(huì)生成一個(gè)Matcher對(duì)象,之后就可以調(diào)用Matcher對(duì)象里面的方法匹配仪缸。例如:

Pattern p = Pattern.compile("a*b");   //編譯正則表達(dá)式
Matcher m = p.matcher("aaaaab");   //要檢索的字符串
/**
*Attempts to match the entire region against the pattern.
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*/
boolean b = m.matches();

下面的代碼跟上面實(shí)現(xiàn)了同樣功能

boolean b = Pattern.matches("a*b", "aaaaab");

CharSequence

接口CharSequence從CharBuffer贵涵、String、StringBuilder恰画、StringBuffer類中抽象出了字符序列的一般化定義:

interface CharSequence {
  charAt(int i);
  length();
  subSequence(int start, int end);
  toString();
}

因此下面Pattern和Matcher的一些方法是以CharSequence對(duì)象作為參數(shù)宾茂。

Pattern

Patten類的定義

public final class Pattern
extends Object
implements Serializable

Pattern對(duì)象表示編譯后的正則表達(dá)式。由于Pattern是final的拴还,所以是不可變的跨晴,線程安全的。

一些常用的方法:

編譯正則表達(dá)式
public static Pattern compile(String regex)
public static Pattern compile(String regex, int flags)

flags表示編譯標(biāo)記片林,一共有9種端盆,他們都是final static int類型的,分別是

  • Pattern.CANON_EQ
  • Pattern.CASE_INSENSITIVE(?i)
  • Pattern.COMMENTS(?x)
  • Pattern.DOTALL(?s)
  • Pattern.LITERAL
  • Pattern.MULTILINE(?m)
  • Pattern.UNICODE_CASE(?u)
  • Pattern.UNICODE_CHARACTER_CLASS(?U)
  • Pattern.UNIX_LINES(?d)
    后面括號(hào)字符表示當(dāng)插入到字符串里面會(huì)被識(shí)別到而啟動(dòng)這種模式(注意:可以插入到任何位置)费封。例如:
    Matcher m = Pattern.compile("(?m)(\\\\S+)\\\\s+((\\\\S+)\\\\s+(\\\\S+))$").matcher("I love Java");
    等于
    Matcher m = Pattern.compile("(\\\\S+)\\\\s+((\\\\S+)\\\\s+(\\\\S+))$", Pattern.MULTILINE).matcher("I love Java");
生成Matcher對(duì)象
public Matcher matcher(CharSequence input)
匹配操作
public static boolean matches(String regex, CharSequence input)
public String[] split(CharSequence input, int limit)
public String[] split(CharSequence input)

Matcher

Matcher類的定義

public final class Matcher
extends Object
implements MatchResult

Matcher是通過(guò)解釋Pattern而在CharSequence上執(zhí)行匹配操作的一個(gè)引擎焕妙。通過(guò)調(diào)用Pattern.matcher()方法可以生產(chǎn)一個(gè)Matcher對(duì)象。創(chuàng)建之后弓摘,Matcher對(duì)象就可以執(zhí)行三種匹配操作:

  • The matches method attempts to match the entire input sequence against the pattern.(只有在整個(gè)輸入都匹配正則表達(dá)式時(shí)才會(huì)返回true)
  • The lookingAt method attempts to match the input sequence, starting at the beginning, against the pattern.(字符串開(kāi)始處匹配正則表達(dá)式就返回true焚鹊,否則返回false)
  • The find method scans the input sequence looking for the next subsequence that matches the pattern.

這三個(gè)方法都返回boolean標(biāo)志表明匹配成功或者失敗。如果成功了就可以調(diào)用其他方法進(jìn)行各種操作韧献。

一些常用的方法:

匹配操作
/**
*Attempts to match the entire region against the pattern.
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*
*Returns:
*true if, and only if, the entire region sequence matches this matcher's pattern
*/
public boolean matches()
/**
*Attempts to find the next subsequence of the input sequence that matches the pattern.
*This method starts at the beginning of this matcher's region, or, if a previous invocation of the method was successful and the matcher has not since been reset, at the first character not matched by the previous match.
*
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*
*Returns:
*true if, and only if, a subsequence of the input sequence matches this matcher's pattern
*/
public boolean find()
public boolean find(int start)
/**
*Attempts to match the input sequence, starting at the beginning of the region, against the pattern.
*Like the matches method, this method always starts at the beginning of the region; unlike that method, it does not require that the entire region be matched.
*
*If the match succeeds then more information can be obtained via the start, end, and group methods.
*
*Returns:
*true if, and only if, a prefix of the input sequence matches this matcher's pattern
*/
public boolean lookingAt()
組(Groups)

組是用括號(hào)劃分的正則表達(dá)式末患,可以根據(jù)組的編號(hào)來(lái)引用某個(gè)組。組號(hào)為0表示整個(gè)表達(dá)式锤窑,組號(hào)1表示被第一個(gè)括號(hào)括起的組璧针,以此類推。例如:
A(B(C))D
中有3個(gè)組:組0是ABCD渊啰,組1是BC探橱,組2是C。

//返回該匹配器的模式中的分組數(shù)目虽抄,第0組不包括在內(nèi)走搁。在group、start和end方法中可以使用小于此數(shù)目的數(shù)字作為numth參數(shù)
public int groupCount()

//返回前一次匹配(例如find())操作的第0組(整個(gè)匹配)
public String group()
//返回編號(hào)為num的捕獲型括號(hào)匹配的內(nèi)容迈窟,如果匹配成功私植,但是指定的組沒(méi)有匹配輸入字符串的任何部分,則將會(huì)返回null
public String group(int group)
public String group(String name)

//返回這個(gè)匹配起點(diǎn)的絕對(duì)偏移值车酣,start()就等于start(0)
public int start()
//返回編號(hào)為第group的捕獲型括號(hào)所匹配文本的起點(diǎn)在目標(biāo)字符串中的絕對(duì)偏移值——即從目標(biāo)字符串起始位置開(kāi)始計(jì)算的偏移值曲稼。如果匹配型括號(hào)沒(méi)有參與匹配索绪,則返回-1
public int start(int group)

public int end()
//放回在前一次匹配操作中尋找到的組的最后一個(gè)字符索引加一的值
public int end(int group)
查找與替換
public String replaceAll(String replacement)
public String replaceFirst(String replacement)

public static String quoteReplacement(String s)
設(shè)置與修改的方法
  • MatchResult對(duì)象
//返回的MatchResult對(duì)象封裝了當(dāng)前匹配的信息。
public MatchResult toMatchResult()
  • Pattern對(duì)象
//更改為新的Pattern對(duì)象
public Matcher usePattern(Pattern newPattern)
//返回目前所用的Pattern對(duì)象
public Pattern pattern()
  • 目標(biāo)字符串(或其他CharSequence對(duì)象)
//重置回原來(lái)整個(gè)字符串
public Matcher reset()
//設(shè)置新的字符串
public Matcher reset(CharSequence input)
  • 目標(biāo)字符串的檢索范圍
//設(shè)置新的字符檢索范圍
public Matcher region(int start, int end)
//返回當(dāng)前字符檢索范圍起始
public int regionStart()
//返回當(dāng)前字符檢索范圍結(jié)束
public int regionEnd()
  • anchoring bounds標(biāo)志位
public Matcher useAnchoringBounds(boolean b)
public boolean hasAnchoringBounds()
  • transparent bounds標(biāo)志位
public Matcher useTransparentBounds(boolean b)
public boolean hasTransparentBounds()
只讀屬性
  • 目標(biāo)字符串中的match pointer或current pointer贫悄,用于支持“尋找下一個(gè)匹配”的操作瑞驱。
  • 目標(biāo)字符串的append pointer,在查找-替換操作中窄坦,復(fù)制未匹配的文本部分時(shí)使用唤反。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸭津,隨后出現(xiàn)的幾起案子彤侍,更是在濱河造成了極大的恐慌,老刑警劉巖逆趋,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盏阶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闻书,警方通過(guò)查閱死者的電腦和手機(jī)名斟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)魄眉,“玉大人砰盐,你說(shuō)我怎么就攤上這事】勇桑” “怎么了楞卡?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)脾歇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)淘捡,這世上最難降的妖魔是什么藕各? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮焦除,結(jié)果婚禮上激况,老公的妹妹穿的比我還像新娘。我一直安慰自己膘魄,他們只是感情好乌逐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著创葡,像睡著了一般浙踢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灿渴,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天洛波,我揣著相機(jī)與錄音胰舆,去河邊找鬼。 笑死蹬挤,一個(gè)胖子當(dāng)著我的面吹牛缚窿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焰扳,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼倦零,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吨悍?” 一聲冷哼從身側(cè)響起扫茅,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畜份,沒(méi)想到半個(gè)月后诞帐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爆雹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年停蕉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钙态。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慧起,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出册倒,到底是詐尸還是另有隱情蚓挤,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布驻子,位于F島的核電站灿意,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏崇呵。R本人自食惡果不足惜缤剧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望域慷。 院中可真熱鬧荒辕,春花似錦、人聲如沸犹褒。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叠骑。三九已至李皇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宙枷,已是汗流浹背疙赠。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工付材, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圃阳。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓厌衔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捍岳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子富寿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • Java的正則表達(dá)式講解:(為了能看清,本文正則表達(dá)式用中文的句號(hào)代替英文句點(diǎn)) 英文句點(diǎn)符號(hào):匹配單個(gè)任意字符锣夹。...
    紅姑娘閱讀 4,356評(píng)論 0 2
  • 正則表達(dá)式描述的是一種規(guī)則页徐,符合這種限定規(guī)則的字符串我們認(rèn)為它某種滿足條件的,是我們所需的银萍。在正則表達(dá)式中变勇,主要有...
    Single_YAM閱讀 744評(píng)論 0 4
  • 三年前的二三月份,那是頭一次來(lái)成都贴唇,沒(méi)有霧霾搀绣,街道干凈,學(xué)生時(shí)代的我們戳气,沒(méi)有工作壓力链患,那時(shí)真的叫生活愜意巴適。當(dāng)時(shí)...
    孤遠(yuǎn)閱讀 265評(píng)論 0 0
  • 本人小白瓶您,初學(xué)java麻捻,無(wú)意中接觸到hihocode,看到上面有題目從簡(jiǎn)到難呀袱,手癢故一試贸毕。奈何水平有限只能從最簡(jiǎn)單...
    邁巴赫棉拖閱讀 744評(píng)論 0 0
  • 推銷崖咨,無(wú)處不在。當(dāng)老板有任務(wù)時(shí)油吭,你總想第一時(shí)間去承擔(dān);當(dāng)孩子的老師交待要做小椅子時(shí)署拟,你巴不得自己就是木工馬上給做兩...
    田田教練閱讀 199評(píng)論 0 1