摘要:正則表達(dá)式是一個(gè)用正則表達(dá)式所訂制的模式來(lái)對(duì)字符串進(jìn)行匹配工作的類(lèi)庫(kù)包。是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。
Java正則表達(dá)式
正則表達(dá)式的構(gòu)造摘要java.util.regex是一個(gè)用正則表達(dá)式所訂制的模式來(lái)對(duì)字符串進(jìn)行匹配工作的類(lèi)庫(kù)包。它包括兩個(gè)類(lèi):Pattern和Matcher。Pattern是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式。Matcher對(duì)象是一個(gè)狀態(tài)機(jī)器,它依據(jù)Pattern對(duì)象做為匹配模式對(duì)字符串展開(kāi)匹配檢查。 首先一個(gè)Pattern實(shí)例訂制了一個(gè)所用語(yǔ)法與PERL的類(lèi)似的正則表達(dá)式經(jīng)編譯后的模式,然后一個(gè)Matcher實(shí)例在這個(gè)給定的Pattern實(shí)例的模式控制下進(jìn)行字符串的匹配工作。
詳細(xì)摘要請(qǐng)看jdk中文文檔,下面我只是列出一些經(jīng)常使用的
構(gòu)造 | 匹配 |
---|---|
. | 任何字符(與行結(jié)束符可能匹配也可能不匹配) |
d | 數(shù)字:[0-9] |
D | 非數(shù)字: 1 |
s | 空白字符:[ tnx0Bfr] |
S | 非空白字符:2 |
w | 單詞字符:[a-zA-Z_0-9] |
W | 非單詞字符:3 |
[abc] | a、b 或 c(簡(jiǎn)單類(lèi)) |
4 | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,兩頭的字母包括在內(nèi)(范圍) |
^ | 行的開(kāi)頭 |
$ | 行的結(jié)尾 |
X? | X,一次或一次也沒(méi)有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超過(guò) m 次 |
創(chuàng)建對(duì)象正則表達(dá)式的編譯表示形式,學(xué)過(guò)python的都知道這個(gè)和python的正則表達(dá)式有異曲同工之妙。 但是它的構(gòu)造方法是私有的,因此不能直接創(chuàng)建對(duì)象,但是可以調(diào)用它的靜態(tài)方法返回一個(gè)對(duì)象,下面會(huì)詳細(xì)介紹
Pattern類(lèi)用于創(chuàng)建一個(gè)正則表達(dá)式,也可以說(shuō)創(chuàng)建一個(gè)匹配模式,它的構(gòu)造方法是私有的,不可以直接創(chuàng)建,但可以通過(guò)Pattern.complie(String regex)簡(jiǎn)單工廠(chǎng)方法創(chuàng)建一個(gè)正則表達(dá)式,代碼如下:
//采用的complie(String regex) Pattern pattern = Pattern.compile("d+"); //采用的是complie(String regex,int flag)其中flag表示標(biāo)志,下面的標(biāo)志表示忽略字母大小寫(xiě),詳細(xì)的字段請(qǐng)看文檔 Pattern pattern=Pattern.compile("(CHEN)(D*)(d*)",Pattern.CASE_INSENSITIVE);常用方法
Pattern compile(String regex) 用于創(chuàng)建Pattern對(duì)象
Pattern compile(String regex,int flags) 用于創(chuàng)建Pattern對(duì)象,并且指定了標(biāo)志(比如忽略字母大小寫(xiě))
int flags() 返回此模式的匹配標(biāo)志
String pattern() 返回在其中編譯過(guò)此模式的正則表達(dá)式。
String[] split(CharSequence input) 根據(jù)此模式的正則表達(dá)式將輸入的字符串拆分成String數(shù)組,默認(rèn)的都是全部拆分開(kāi)
//給出正則表達(dá)式用于匹配數(shù)字(0-9) Pattern pattern = Pattern.compile("d+"); String str = "我是陳加兵456鄭元梅34擦市場(chǎng)的邏輯啊"; String[] splits = pattern.split(str, 2); //結(jié)果:[我是陳加兵,鄭元梅34擦市場(chǎng)的邏輯啊]
String[] split(CharSequence input,int limit) 將字符串按照正則表達(dá)式表示的內(nèi)容進(jìn)行分組,如果limit>0那么就分成limit個(gè)組,如果limit<0就按照默認(rèn)全部分開(kāi)
//給出正則表達(dá)式用于匹配數(shù)字(0-9) Pattern pattern = Pattern.compile("d+"); String str = "我是陳加兵456鄭元梅34擦市場(chǎng)的邏輯啊"; String[] splits = pattern.split(str, 2); //結(jié)果:[我是陳加兵,鄭元梅34擦市場(chǎng)的邏輯啊]
Pattern.matches(String regex,CharSequence input)是一個(gè)靜態(tài)方法,用于快速匹配字符串,該方法適合用于只匹配一次,且匹配全部字符串
Pattern.matches("d+","2223");//返回true Pattern.matches("d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到 Pattern.matches("d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到
Matcher matcher(CharSequence input) 創(chuàng)建匹配給定輸入與此模式的匹配器,現(xiàn)在只是先了解以下,下面會(huì)詳細(xì)解釋Matcher這個(gè)類(lèi)
Pattern p=Pattern.compile("d+"); Matcher m=p.matcher("22bb23");Matcher
常用的方法Pattern類(lèi)只能做一些簡(jiǎn)單的匹配操作,要想得到更強(qiáng)更便捷的正則匹配操作,那就需要將Pattern與Matcher一起合作.Matcher類(lèi)提供了對(duì)正則表達(dá)式的分組支持,以及對(duì)正則表達(dá)式的多次匹配支持.
Matcher類(lèi)和Pattern類(lèi)一樣它的構(gòu)造方法同樣是私有的,因此不能直接構(gòu)造對(duì)象,但是上面我們說(shuō)過(guò)Pattern類(lèi)中有一個(gè)方法可以返回一個(gè)Matcher對(duì)象(matcher(CharSequence input))
boolean mathces() 嘗試將整個(gè)區(qū)域與模式匹配(針對(duì)的是整個(gè)字符串,如果整個(gè)字符串未完全匹配,那么返回false,如果完全匹配那么返回true)
Pattern pattern=Pattern.compile("d+"); //創(chuàng)建Pattern對(duì)象 String str="I am hreo 1234"; //需要匹配的字符串 Matcher matcher=pattern.matcher(str); //并沒(méi)有完全匹配,因此返回false,如果str="123445",那么就會(huì)返回true System.out.println(matcher.matches());
boolean lookingAt() 嘗試從給定字符串的開(kāi)頭開(kāi)始匹配,如果有子字符串匹配成功,那么返回true(針對(duì)的不是整個(gè)字符串,而是從開(kāi)頭開(kāi)始,如果開(kāi)頭有一段字符串匹配成功,那么返回true)
Pattern pattern=Pattern.compile("d+"); //創(chuàng)建Pattern對(duì)象 String str="1234 I am a hero"; //需要匹配的字符串 Matcher matcher=pattern.matcher(str); //開(kāi)頭的1234匹配到了,因此返回true,如果str="I am a hero 1234"將返回false System.out.println(matcher.lookingAt());
int start() 匹配到的字符串的第一個(gè)元素的索引,如果沒(méi)有匹配到調(diào)用此方法將會(huì)報(bào)錯(cuò)
int end() 匹配到的字符串的最后一個(gè)元素的索引,如果沒(méi)有匹配到調(diào)用此方法將會(huì)報(bào)錯(cuò)
String group() 返回的是匹配到的字符串,如果沒(méi)有匹配到調(diào)用此方法將會(huì)報(bào)錯(cuò)
Pattern pattern=Pattern.compile("d+"); //創(chuàng)建Pattern對(duì)象 String str="1234 I am a hero 33455"; //需要匹配的字符串 Matcher matcher=pattern.matcher(str); if(matcher.lookingAt()) { System.out.println("開(kāi)始匹配到下標(biāo)為"+matcher.start()); //0 System.out.println("匹配結(jié)束的下標(biāo)為"+matcher.end()); //4 System.out.println("匹配的字符串為"+matcher.group()); //1234 }
boolean find() 查找整個(gè)字符串,如果在任意位置有一段字符串能夠匹配成功,那么返回true(任意位置),然后如果再次調(diào)用這個(gè)查找的話(huà),那么就從上次查找到的末尾開(kāi)始匹配,也就是說(shuō)查找的是下一個(gè)子序列了
Pattern pattern=Pattern.compile("d+"); //創(chuàng)建Pattern對(duì)象 String str="1234 I am a hero 6666 chenjiabing8888"; //需要匹配的字符串 Matcher matcher=pattern.matcher(str); while(matcher.find()) //如果還有匹配的字符序列 { System.out.println("開(kāi)始匹配到下標(biāo)為"+matcher.start()); System.out.println("匹配結(jié)束的下標(biāo)為"+matcher.end()); System.out.println("匹配的字符串為"+matcher.group()); } /*結(jié)果如下: * 開(kāi)始匹配到下標(biāo)為0 匹配結(jié)束的下標(biāo)為4 匹配的字符串為1234 開(kāi)始匹配到下標(biāo)為17 匹配結(jié)束的下標(biāo)為21 匹配的字符串為6666 開(kāi)始匹配到下標(biāo)為33 匹配結(jié)束的下標(biāo)為37 匹配的字符串為8888 */ /* * 從上面返回的結(jié)果可以知道,find()可以匹配多次只要這個(gè)字符串還有可以匹配, * 并且每次的匹配字段的開(kāi)始下標(biāo)都是上一次匹配的結(jié)束字母的下一個(gè)下標(biāo) */
boolean find(int start) 從指定的索引start位置開(kāi)始匹配,這個(gè)用于重置find()匹配器,因?yàn)橹苯邮褂胒ind()它的每次開(kāi)始的索引都是不一樣的
String group(int num) 返回指定分組匹配到的字符串,group(0)表示匹配到的整個(gè)字符串,group(1) 表示匹配到的第一個(gè)字符(即是第一個(gè)括號(hào)中匹配的模式)
int groupCount() 返回匹配到的分組個(gè)數(shù)
String replaceAll(String str) 將所有于模式相匹配的 字符串全部替換程指定的字符串str,返回的是替換后的文本
String replaceFirst(String str) 只將第一次匹配到的字符串替換成指定的字符串str,返回的時(shí)替換后的文本
Pattern pattern=Pattern.compile("d+"); String str="chenjiabing2344cal3445"; Matcher matcher=pattern.matcher(str); str=matcher.replaceFirst("陳加兵"); System.out.println(str); //輸出:chenjiabing陳加兵cal3445 /* * str=matcher.replaceAll("陳加兵"); * System.out.println(str) //輸出:chenjiabing陳加兵cal陳加兵 */捕獲組
捕獲組可以通過(guò)從左到右計(jì)算其開(kāi)括號(hào)來(lái)編號(hào),編號(hào)是從1 開(kāi)始的。例如,在表達(dá)式 ((A)(B(C)))中,存在四個(gè)這樣的組:
((A)(B(C))) (A) (B(C)) (C)
總之在正則表達(dá)式中在括號(hào)中的就是一個(gè)分組,下面用一個(gè)實(shí)例來(lái)理解一下
Pattern pattern=Pattern.compile("(D*)(d+)s(D+)"); Matcher matcher=pattern.matcher("chenjiabingshizuibangde6666 chenjiabign"); if(matcher.find()) { System.out.println("總共匹配到了"+matcher.groupCount()+"個(gè)分組"); System.out.println("匹配到整個(gè)字符串為"+matcher.group(0)); System.out.println("匹配到的第一個(gè)字符串為"+matcher.group(1)); System.out.println("匹配到的第二個(gè)字符串為"+matcher.group(2)); System.out.println("匹配到的第三個(gè)字符串為"+matcher.group(3)); }貪婪模式和非貪婪模式
實(shí)例貪婪與非貪婪模式影響的是被量詞修飾的子表達(dá)式的匹配行為,貪婪模式在整個(gè)表達(dá)式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個(gè)表達(dá)式匹配成功的前提下,盡可能少的匹配
一般寫(xiě)python爬蟲(chóng)的時(shí)候使用的都是非貪婪模式來(lái)匹配
使用了貪婪模式后會(huì)盡可能匹配更多的字符串,即是到了正則表達(dá)式定的末尾但是還是會(huì)繼續(xù)向后匹配,看看是否還能匹配,非貪婪模式則是相反,到了正則表達(dá)式定義的結(jié)束字符就直接停止匹配了
貪婪模式: .* , .+
非貪婪模式: .*? , .+?
//使用了貪婪模式,因此當(dāng)匹配到第一個(gè)
http://www.cnblogs.com/ggjucheng/p/3423731.html
http://www.runoob.com/java/java-regular-expressions.html
http://blog.csdn.net/lxcnn/article/details/4756030
0-9 ?
s ?
w ?
abc ?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70136.html
Javascript的正則表達(dá)式是前端中比較重要的部分,正則表達(dá)式主要用于字符串處理,表單驗(yàn)證等場(chǎng)合,實(shí)用高效,文章主要對(duì)JavaScript中的正則的學(xué)習(xí)與總結(jié) 正則表達(dá)式的定義 正則表達(dá)式:是一個(gè)描述字符模式的對(duì)象,JavaScrip中正則表達(dá)式用RegExp對(duì)象表示,可以使用RegExp構(gòu)造函數(shù)來(lái)創(chuàng)建正則對(duì)象 正則表達(dá)式的創(chuàng)建 1.字面量創(chuàng)建 var reg = /[a-z]/; 2.構(gòu)...
摘要:正則表達(dá)式的意義中的正則表達(dá)式使用表示,可以使用構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象,不過(guò)對(duì)象更多的是通過(guò)一種特殊的直接量語(yǔ)法來(lái)創(chuàng)建。用構(gòu)造函數(shù)也可以定義一個(gè)與之等價(jià)的正則表達(dá)式,代碼如下正則表達(dá)式的模式規(guī)則是由一個(gè)字符序列組成的。 正則表達(dá)式的模式匹配 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對(duì)象。javascript的RegExp對(duì)象表示正則表達(dá)式,String和Reg...
摘要:正則表達(dá)式等待匹配的字符這里可以輸入任何繼承了的類(lèi)返回一個(gè)值說(shuō)明是否匹配這里需要注意的是,和均不允許通過(guò)構(gòu)造器新建一個(gè)對(duì)象。 前言 之前一直想要做一個(gè)自己的爬蟲(chóng),然后從nba數(shù)據(jù)相關(guān)的網(wǎng)上【虎撲,騰訊,官網(wǎng)等,要視網(wǎng)站是否支持】爬點(diǎn)數(shù)據(jù)寫(xiě)數(shù)據(jù)分析和圖形化展示。雖然年輕的時(shí)候就實(shí)現(xiàn)過(guò)這個(gè)功能,但是當(dāng)時(shí)直接借用了一個(gè)網(wǎng)上現(xiàn)成的jar包,然后在那個(gè)基礎(chǔ)上寫(xiě)了一個(gè)非常簡(jiǎn)陋的正則表達(dá)式來(lái)提取數(shù)據(jù)...
摘要:正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對(duì)字符串進(jìn)行查找提取分隔替換等操作。例如,正則表達(dá)式用于匹配的三個(gè)訪(fǎng)問(wèn)控制符其中之一邊界匹配符數(shù)量標(biāo)識(shí)符貪婪模式數(shù)量表示符默認(rèn)采用貪婪模式。方法以空格為分隔符,將字符串分割成多個(gè)子串哈哈 正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對(duì)字符串進(jìn)行查找、提取、分隔、替換等操作。String類(lèi)里提供了如下幾個(gè)特殊方法 boolean matches(...
摘要:選擇分組和引用正則表達(dá)式的語(yǔ)法還包括指定選擇項(xiàng)子表達(dá)式分組和引用前一子表達(dá)式的特殊字符。帶圓括號(hào)的表達(dá)式的另一個(gè)用途是允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。 正則表達(dá)式(regular expression)是一個(gè)描述字符模式的對(duì)象。JavaScript的 RegExp類(lèi) 表示正則表達(dá)式,String和RegExp都定義了方法,后者使用正則表達(dá)式進(jìn) 行強(qiáng)大的模式匹配和文本檢索與...
摘要:表示進(jìn)行多行匹配。如果正則表達(dá)式中含有子表達(dá)式,那么該數(shù)組后續(xù)的項(xiàng)依次為匹配到的第一個(gè)子表達(dá)式的匹配結(jié)果,第二個(gè)第個(gè)。關(guān)于正則方法有一點(diǎn)必須要提,很容易導(dǎo)致錯(cuò)誤的情況。這時(shí)候直接使用該正則表達(dá)式對(duì)進(jìn)行方法調(diào)用,卻返回了。匹配前一項(xiàng)至少次。有人說(shuō),一行正則抵得上100行代碼……正則表達(dá)式,每門(mén)語(yǔ)言都有,在我們的js開(kāi)發(fā)中,最常見(jiàn)的使用場(chǎng)景:一是表單驗(yàn)證,像是登錄注冊(cè)啊,用戶(hù)輸入檢測(cè)啊,不管在前...
閱讀 1451·2021-11-22 13:54
閱讀 4369·2021-09-22 15:56
閱讀 1825·2021-09-03 10:30
閱讀 1324·2021-09-03 10:30
閱讀 2091·2019-08-30 15:55
閱讀 1858·2019-08-30 14:13
閱讀 2064·2019-08-29 15:19
閱讀 2368·2019-08-28 18:13