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