1. JS正則表達式完整教程30
親愛的讀者朋友,如果你點開了這篇文章,說明你對正則很感興趣。
想必你也了解正則的重要性,在我看來正則表達式是衡量程序員水平的一個側面標准。
關於正則表達式的教程,網上也有很多,相信你也看了一些。
與之不同的是,本文的目的是希望所有認真讀完的童鞋們,都有實質性的提高。
本文內容共有七章,用javaScript語言完整地討論了正則表達式的方方面面。
如果覺得文章某塊兒沒有說明白清楚,歡迎留言,能力范圍之內,老姚必做詳細解答。
構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字元與運算符可以將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字元、字元集合、字元范圍、字元間的選擇或者所有這些組件的任意組合。
正則表達式是由普通字元(例如字元 a 到 z)以及特殊字元(稱為"元字元")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字元串。正則表達式作為一個模板,將某個字元模式與所搜索的字元串進行匹配。
2. JS正則表達式完整教程-A-5
親愛的讀者朋友,如果你點開了這篇文章,說明你對正則很感興趣。
想必你也了解正則的重要性,在我看來正則表達式是衡量程序員水平的一個側面標准。
關於正則表達式的教程,網上也有很多,相信你也看了一些。
與之不同的是,本文的目的www.bilibili.com是希望所有認真讀完的童鞋們,都有實質性的提高。
本文內容共有七章,用JavaScript語言完整地討論了正則表達式的方方面面。
如果覺得文章某塊兒沒有說明白清楚,歡迎留言,能力范圍之內,老姚必做詳細解答。
具體章節如下:阿達阿薩德,阿達阿sasda薩德<a href="http://www.123.com" target="_blank">阿達阿薩德</a>啊實打實asd第三方asdasdasdasda
3. 看完就懂系列之正則表達式(值得收藏)
正則表達式是很多程序員,甚至是一些有了多年經驗的開發者薄弱的一項技能。大家都很多時候都會覺得正則表達式難記、難學、難用,但不可否認的是正則表達式是一項很重要的技能,所有我將學習和使用正則表達式時的關鍵點整理如下,供大家參考。
正則表達式(Regular Expression 或 Regex),是用於定義某種特定搜索模式的字元組合。正則表達式可用於匹配、查找和替換文本中的字元,進行輸入數據的驗證,查找英文單詞的拼寫錯誤等。
調試工具
下面列出了幾款優秀的在線調試工具,如果你想創建或者調試正則表達式可能會需要。個人比較偏好Regex101,regex101 支持在正則表達式的不同 flavor 之間切換、解釋你的正則表達式、顯示匹配信息、提供常用語法參考等功能,非常強大。
Regex101
Regexr
Regexpal
在 Javascript 中,一個正則表達式以 / 開頭和結尾,所以簡單至 /hello regexp/ 就是一個正則表達式。
Flags(標志符或修飾符)
Flags 寫在結束的/之後,可以影響整個正則表達式的匹配行為。常見的 flags 有:
Flags 可以組合使用,如:
Character Sets(字元集合)
用於匹配字元集合中的任意一個字元,常見的字元集有:
比如匹配所有的字母和數字可以寫成:/[a-zA-Z0-9]/ 或者 /[a-z0-9]/i。
Quantifiers (量詞)
在實際使用中,我們常常需要匹配同一類型的字元多次,比如匹配 11 位的手機號,我們不可能將 [0-9] 寫 11 遍,此時我們可以使用 Quantifiers 來實現重復匹配。
Metacharacters(元字元)
在正則表達式中有一些具有特殊含義的字母,被稱為元字元,簡言之,元字元就是描述字元的字元,它用於對字元表達式的內容、轉換及各種操作信息進行描述。
常見的元字元有:
Special Characters (特殊字元)
正則中存在一些特殊字元,它們不會按照字面意思進行匹配,而有特殊的意義,比如前文講過用於量詞的?、*、+。其他常見的特殊字元有:
Groups(分組)
Assertion(斷言)
最後,推薦大家使用Fundebug,一款很好用的 BUG 監控工具~
上面羅列出了這么多正則表達式的語法和規則,可以在一定程度上幫助我們分析和理解一段正則表達式的作用,但是如何將這些規則組合並創造出有特定作用的表達式還需要我們自己多加練習,下面舉幾個例子來說明運用這些規則。
1. 匹配手機號碼
我們先從比較簡單的匹配手機號碼開始。目前國內的手機號碼是1(3/4/5/7/8)開頭的 11 位數字,因此手機號碼的正則可以分解為以下幾部分:
組合起來即為 /^1[34578]d{9}$/ 或 /^1(3|4|5|7|8)d{9}$/,因為使用捕獲括弧存在性能損失,所以推薦使用第一種寫法。
2. 匹配電子郵件
標準的電子郵件組成為 <yourname>@<domain>.<extension><optional-extension>,
每部分的格式標准為(進行了相應的簡化,主要為展示如何書寫正則):
每部分的正則表達式為:
組合起來形成最後的正則表達式:/^([a-zd._-]+)@([a-zd-]+).([a-z]{2,8})(.[a-z]{2,8})?$/;為了增加可讀性可以將每部分用"()"包起來,並不要忘記起始和結束符 ^$。
4. 正則表達式是什麼意思
如果原來沒有使用過正則表達式,那麼可能對這個術語和概念會不太熟悉。不過,它們並不是您想像的那麼新奇。
請回想一下在硬碟上是如何查找文件的。您肯定會使用 ? 和 * 字元來幫助查找您正尋找的文件。? 字元匹配文件名中的單個字元,而 * 則匹配一個或多個字元。一個如 'data?.dat' 的模式可以找到下述文件:
data1.dat
data2.dat
datax.dat
dataN.dat
如果使用 * 字元代替 ? 字元,則將擴大找到的文件數量。'data*.dat' 可以匹配下述所有文件名:
data.dat
data1.dat
data2.dat
data12.dat
datax.dat
dataXYZ.dat
盡管這種搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你對正則表達式能做什麼有一個概念,不過正則表達式的功能更強大,也更靈活。
望採納謝謝
5. C語言怎麼用正則表達式
由於它可以極大地簡化處理字元串時的復雜度,因此現在已經在許多 L i n u x 實用工具中得到了應用。千萬不要以為正則表達式只是 P e r l 、 P y t h o n 、 B a s h 等腳本語言的專利,作為 C 語言程序員,用戶同樣可以在自己的程序中運用正則表達式。標準的 C 和 C + + 都不支持正則表達式,但有一些函數庫可以輔助 C / C + + 程序員完成這一功能,其中最著名的當數 P h i l i p H a z e l 的 P e r l - C o m p a t i b l e R e g u l a r E x p r e s s i o n 庫,許多 L i n u x 發行版本都帶有這個函數庫。編譯正則表達式為了提高效率,在將一個字元串與正則表達式進行比較之前,首先要用 r e g c o m p ( ) 函數對它進行編譯,將其轉化為 r e g e x _ t 結構: i n t r e g c o m p ( r e g e x _ t * p r e g , c o n s t c h a r * r e g e x , i n t c f l a g s ) ; 參數 r e g e x 是一個字元串,它代表將要被編譯的正則表達式;參數 p r e g 指向一個聲明為 r e g e x _ t 的數據結構,用來保存編譯結果;參數 c f l a g s 決定了正則表達式該如何被處理的細節。如果函數 r e g c o m p ( ) 執行成功,並且編譯結果被正確填充到 p r e g 中後,函數將返回 0 ,任何其它的返回結果都代表有某種錯誤產生。匹配正則表達式一旦用 r e g c o m p ( ) 函數成功地編譯了正則表達式,接下來就可以調用 r e g e x e c ( ) 函數完成模式匹配: i n t r e g e x e c ( c o n s t r e g e x _ t * p r e g , c o n s t c h a r * s t r i n g , s i z e _ t n m a t c h , r e g m a t c h _ t p m a t c h [ ] , i n t e f l a g s ) ; t y p e d e f s t r u c t { r e g o f f _ t r m _ s o ; r e g o f f _ t r m _ e o ; } r e g m a t c h _ t ; 參數 p r e g 指向編譯後的正則表達式,參數 s t r i n g 是將要進行匹配的字元串,而參數 n m a t c h 和 p m a t c h 則用於把匹配結果返回給調用程序,最後一個參數 e f l a g s 決定了匹配的細節。在調用函數 r e g e x e c ( ) 進行模式匹配的過程中,可能在字元串 s t r i n g 中會有多處與給定的正則表達式相匹配,參數 p m a t c h 就是用來保存這些匹配位置的,而參數 n m a t c h 則告訴函數 r e g e x e c ( ) 最多可以把多少個匹配結果填充到 p m a t c h 數組中。當 r e g e x e c ( ) 函數成功返回時,從 s t r i n g + p m a t c h [ 0 ] . r m _ s o 到 s t r i n g + p m a t c h [ 0 ] . r m _ e o 是第一個匹配的字元串,而從 s t r i n g + p m a t c h [ 1 ] . r m _ s o 到 s t r i n g + p m a t c h [ 1 ] . r m _ e o ,則是第二個匹配的字元串,依此類推。釋放正則表達式無論什麼時候,當不再需要已經編譯過的正則表達式時,都應該調用函數 r e g f r e e ( ) 將其釋放,以免產生內存泄漏。 v o i d r e g f r e e ( r e g e x _ t * p r e g ) ; 函數 r e g f r e e ( ) 不會返回任何結果,它僅接收一個指向 r e g e x _ t 數據類型的指針,這是之前調用 r e g c o m p ( ) 函數所得到的編譯結果。如果在程序中針對同一個 r e g e x _ t 結構調用了多次 r e g c o m p ( ) 函數, P O S I X 標准並沒有規定是否每次都必須調用 r e g f r e e ( ) 函數進行釋放,但建議每次調用 r e g c o m p ( ) 函數對正則表達式進行編譯後都調用一次 r e g f r e e ( ) 函數,以盡早釋放佔用的存儲空間。報告錯誤信息如果調用函數 r e g c o m p ( ) 或 r e g e x e c ( ) 得到的是一個非 0 的返回值,則表明在對正則表達式的處理過程中出現了某種錯誤,此時可以通過調用函數 r e g e r r o r ( ) 得到詳細的錯誤信息。 s i z e _ t r e g e r r o r ( i n t e r r c o d e , c o n s t r e g e x _ t * p r e g , c h a r * e r r b u f , s i z e _ t e r r b u f _ s i z e ) ; 參數 e r r c o d e 是來自函數 r e g c o m p ( ) 或 r e g e x e c ( ) 的錯誤代碼,而參數 p r e g 則是由函數 r e g c o m p ( ) 得到的編譯結果,其目的是把格式化消息所必須的上下文提供給 r e g e r r o r ( ) 函數。在執行函數 r e g e r r o r ( ) 時,將按照參數 e r r b u f _ s i z e 指明的最大位元組數,在 e r r b u f 緩沖區中填入格式化後的錯誤信息,同時返回錯誤信息的長度。應用正則表達式最後給出一個具體的實例,介紹如何在 C 語言程序中處理正則表達式。 # i n c l u d e < s t d i o . h > ; # i n c l u d e < s y s / t y p e s . h > ; # i n c l u d e < r e g e x . h > ; / * 取子串的函數 * / s t a t i c c h a r * s u b s t r ( c o n s t c h a r * s t r , u n s i g n e d s t a r t , u n s i g n e d e n d ) { u n s i g n e d n = e n d - s t a r t ; s t a t i c c h a r s t b u f [ 2 5 6 ] ; s t r n c p y ( s t b u f , s t r + s t a r t , n ) ; s t b u f [ n ] = 0 ; r e t u r n s t b u f ; } / * 主程序 * / i n t m a i n ( i n t a r g c , c h a r * * a r g v ) { c h a r * p a t t e r n ; i n t x , z , l n o = 0 , c f l a g s = 0 ; c h a r e b u f [ 1 2 8 ] , l b u f [ 2 5 6 ] ; r e g e x _ t r e g ; r e g m a t c h _ t p m [ 1 0 ] ; c o n s t s i z e _ t n m a t c h = 1 0 ; / * 編譯正則表達式 * / p a t t e r n = a r g v [ 1 ] ; z = r e g c o m p ( & r e g , p a t t e r n , c f l a g s ) ; i f ( z ! = 0 ) { r e g e r r o r ( z , & r e g , e b u f , s i z e o f ( e b u f ) ) ; f p r i n t f ( s t d e r r , " % s : p a t t e r n ' % s ' \ n " , e b u f , p a t t e r n ) ; r e t u r n 1 ; } / * 逐行處理輸入的數據 * / w h i l e ( f g e t s ( l b u f , s i z e o f ( l b u f ) , s t d i n ) ) { + + l n o ; i f ( ( z = s t r l e n ( l b u f ) ) > ; 0 & & l b u f [ z - 1 ] = = ' \ n ' ) l b u f [ z - 1 ] = 0 ; / * 對每一行應用正則表達式進行匹配 * / z = r e g e x e c ( & r e g , l b u f , n m a t c h , p m , 0 ) ; i f ( z = = R E G _ N O M A T C H ) c o n t i n u e ; e l s e i f ( z ! = 0 ) { r e g e r r o r ( z , & r e g , e b u f , s i z e o f ( e b u f ) ) ; f p r i n t f ( s t d e r r , " % s : r e g c o m ( ' % s ' ) \ n " , e b u f , l b u f ) ; r e t u r n 2 ; } / * 輸出處理結果 * / f o r ( x = 0 ; x < n m a t c h & & p m [ x ] . r m _ s o ! = - 1 ; + + x ) { i f ( ! x ) p r i n t f ( " % 0 4 d : % s \ n " , l n o , l b u f ) ; p r i n t f ( " $ % d = ' % s ' \ n " , x , s u b s t r ( l b u f , p m [ x ] . r m _ s o , p m [ x ] . r m _ e o ) ) ; } } / * 釋放正則表達式 * / r e g f r e e ( & r e g ) ; r e t u r n 0 ; } 上述程序負責從命令行獲取正則表達式,然後將其運用於從標准輸入得到的每行數據,並列印出匹配結果。執行下面的命令可以編譯並執行該程序: # g c c r e g e x p . c - o r e g e x p # . / r e g e x p ' r e g e x [ a - z ] * ' < r e g e x p . c 0 0 0 3 : # i n c l u d e < r e g e x . h > ; $ 0 = ' r e g e x ' 0 0 2 7 : r e g e x _ t r e g ; $ 0 = ' r e g e x ' 0 0 5 4 : z = r e g e x e c ( & r e g , l b u f , n m a t c h , p m , 0 ) ; $ 0 = ' r e g e x e c ' 小結對那些需要進行復雜數據處理的程序來說,正則表達式無疑是一個非常有用的工具。本文重點在於闡述如何在 C 語言中利用正則表達式來簡化字元串處理,以便在數據處理方面能夠獲得與 P e r l 語言類似的靈活性。
6. 懂正則表達式的java程序員看過來
根據你的要做自己寫了一個,寫的有點啰嗦,不過感覺應該能滿足你的要求,下面是正則式和測試數據
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
publicclassA{
publicstaticvoidmain(String[]args){
//測試數據
Strings1="12sddf";
Strings2="+12345";
Strings3="----1234";
Strings4="----1234.0012";
Strings5="-1234.0012.0112";
Strings6="-1234.00120112";
Strings7="+1234.00120112";
Strings8="-01234.00120112";
Strings9="-1234.";
Strings10="+1234.";
Strings11="+0.";
Strings12="-0.";
Strings13="0.12231321s";
Strings14="0.12231321";
Strings15="-0.12231321";
Strings16="1234";
Strings17="-1234";
Strings18="-01234";
Strings19="+01234";
//最後驗證所有的數
Patternp4=Pattern.compile("^\-{0,1}+[1-9]{1}+[0-9]{0,}$|^\-{0,1}+0{1}+\.{1}+[0-9]{1,}$|^\-{0,1}+[1-9]{1}+[0-9]{0,}+\.{1}+[0-9]{1,}$");
System.out.println(s1+":"+(p4.matcher(s1).find()?"合法的數字":"非法的數字"));
System.out.println(s2+":"+(p4.matcher(s2).find()?"合法的數字":"非法的數字"));
System.out.println(s3+":"+(p4.matcher(s3).find()?"合法的數字":"非法的數字"));
System.out.println(s4+":"+(p4.matcher(s4).find()?"合法的數字":"非法的數字"));
System.out.println(s5+":"+(p4.matcher(s5).find()?"合法的數字":"非法的數字"));
System.out.println(s6+":"+(p4.matcher(s6).find()?"合法的數字":"非法的數字"));
System.out.println(s7+":"+(p4.matcher(s7).find()?"合法的數字":"非法的數字"));
System.out.println(s8+":"+(p4.matcher(s8).find()?"合法的數字":"非法的數字"));
System.out.println(s9+":"+(p4.matcher(s9).find()?"合法的數字":"非法的數字"));
System.out.println(s10+":"+(p4.matcher(s10).find()?"合法的數字":"非法的數字"));
System.out.println(s11+":"+(p4.matcher(s11).find()?"合法的數字":"非法的數字"));
System.out.println(s12+":"+(p4.matcher(s12).find()?"合法的數字":"非法的數字"));
System.out.println(s13+":"+(p4.matcher(s13).find()?"合法的數字":"非法的數字"));
System.out.println(s14+":"+(p4.matcher(s14).find()?"合法的數字":"非法的數字"));
System.out.println(s15+":"+(p4.matcher(s15).find()?"合法的數字":"非法的數字"));
System.out.println(s16+":"+(p4.matcher(s16).find()?"合法的數字":"非法的數字"));
System.out.println(s17+":"+(p4.matcher(s17).find()?"合法的數字":"非法的數字"));
System.out.println(s18+":"+(p4.matcher(s18).find()?"合法的數字":"非法的數字"));
System.out.println(s19+":"+(p4.matcher(s19).find()?"合法的數字":"非法的數字"));
}
}
列印結果
12sddf:非法的數字
+12345:非法的數字
----1234:非法的數字
----1234.0012:非法的數字
-1234.0012.0112:非法的數字
-1234.00120112:合法的數字
+1234.00120112:非法的數字
-01234.00120112:非法的數字
-1234.:非法的數字
+1234.:非法的數字
+0.:非法的數字
-0.:非法的數字
0.12231321s:非法的數字
0.12231321:合法的數字
-0.12231321:合法的數字
1234:合法的數字
-1234:合法的數字
-01234:非法的數字
+01234:非法的數字
7. 程序員的必備技能有哪些
數組、字元串與哈希表
任何受過專業訓練的程序員,對「數據結構」這門課程中涉及到的各種數據結構都不會陌生,但是在實際的編程工作中,大部分的數據結構都不會用到,而且也永遠都不會用到。雖然如此,深入地理解基本數據結構的概念和實現細節,仍然是每個程序員的任務。這不僅僅是因為,掌握這些知識將有利於更加正確和靈活地應用它們,而且也是因為,對於語言背後的實現細節的求知慾是一個優秀程序員的素質。
正則表達式
在程序員日常工作中,數據處理占據了相當的比重。而所有的數據之中文本又占據了相當的比重。文本能夠被人理解、具有良好的透明性,利於系統開發、測試和維護等就必需要有一定規律遵循一種規則,當你掌握一門正則表達式語言,就能夠培養你編程的直覺本能,達到較高水平,也能夠在實踐中提供更高的開發和執行效率。
調試
軟體調試是軟體工程的一個重要部分,其過程出現在軟體工程的各個階段,從最初的可行性分析、原型驗證、到開發和測試階段、再到發布後的維護與支持,都有軟體調試過程參與。學習和靈活運用軟體調試技術,不僅可以提高程序員工作效率,而且有利於對代碼的感知力和控制力,加深對軟體和系統的理解。此外,調試技術是解決各種軟體難題的一種有效武器,它直擊要害、銳不可擋,相對其它間接方法具有明顯的優勢。軟體有大美,調試見真功!
兩門語言
任何一位職業化的軟體技術人員都會將編程語言當成自己的利器。它們代表了開發人員對計算機本身的理解與對軟體開發工作的執著。同時,建立在編程語言之上的基礎也標志著程序員的職業化道路發展到了一個新的階段,而單一語言又有一定的局限性,軟體開發的本質就是處理信息以及數據。一種專門用來處理數據的腳本語言常常是走向更加職業化的必備武器之一。所以精通兩種語言,對於任何一個開發人員來說,並非必須,但是對於一個專業化程度較高的開發人員來說,又常常是必要的。
一個開發環境
隨著技術的進步,IDE已經越來越強大,遠遠超出我們心目中的最初形象,越來越多的內容被涵蓋到IDE中,從需求分析、業務建摸大批軟體發布,IDE已經逐漸覆蓋了軟體開發的整個生命周期。
SQL語言
說起SQL,絕大多數程序員對其作用都瞭然於胸--用來訪問資料庫嘛。確實,數據是信息系統的核心,沒有數據的計算機應用沒有任何意義。信息系統中,大量數據本質上就以實體--關系的模式存在,而RDBMS支持SQL這么簡單但表達能力豐富的訪問介面,同時還提供了內建的事務ACID特性保證和故障恢復能力--因此,RDBMS理所當然地成為了大部分信息系統的標准數據存儲介質。於是,無論使用何種語言開發信息系統,從C、C++,Delphi到Java,從Perl、Python到Ruby,使用SQL訪問RDBMS都是我們必須修煉的武功秘籍。
編寫軟體的思想
說起程序員的武器自然少不了技術書籍,它們就像是拳譜、劍經、雖然不能馬上轉化為巨大的傷害輸出,但假以時日勤以研讀,有朝一日成為傍身絕學也是說不定。不過雖然各類技術書籍汗牛充棟,除去入門時淺顯易用的參考和復雜深奧的學術專著,能夠讓所有程序員常看常新的心法秘籍還是不多。
8. 正則表達式之匹配不存在特定字元的字元串
作為一名不經常使用正則表達式的程序員,想用最簡單的語言來描述否定匹配,不過發現確實不是那麼好理解。還是按照自己知道的來描述吧。
這些都是來源於網上,前人已經總結的很好了。前人栽樹,後人乘涼。我就乘乘涼好了。O(∩_∩)O哈哈~
本次使用 (?!pattern) 匹配,顯而易見它是匹配下一個字元串來判斷本次的匹配是否成功。當然這是一個否定匹配。
在文檔中匹配出,不包含「hello」的字元串。
其中第1,5,6行包含有「hello」字元串。當然這不是重點,重點是怎麼來寫這個正則表達式。
當然,結論是:
運行效果:
將包含有「hello」的字元串全部排除掉了。這樣就實現了我們想要的效果。
_
簡明解釋一下,這個語句的意思:
從頭開始匹配,否定匹配任意字元到「hello」,然後匹配任意字元到尾部結束。
大功告成,回家睡覺。O(∩_∩)O哈哈~
9. java正則表達式是什麼
在程序開發中,難免會遇到需要匹配、查找、替換、判斷字元串的情況發生,而這些情況有時又比較復雜,如果用純編碼方式解決,往往會浪費程序員的時間及精力。因此,學習及使用正則表達式,便成了解決這一矛盾的主要手段。
正則表達式是一種可以用於模式匹配和替換的規范,一個正則表達式就是由普通的字元(例如字元a到z)以及特殊字元(元字元)組成的文字模式,它 用以描述在查找文字主體時待匹配的一個或多個字元串。正則表達式作為一個模板,將某個字元模式與所搜索的字元串進行匹配。
(9)正則程序員擴展閱讀:
正則表達式的特點是:
1、靈活性、邏輯性和功能性非常強;
2、可以迅速地用極簡單的方式達到字元串的復雜控制。
3、對於剛接觸的人來說,比較晦澀難懂。
由於正則表達式主要應用對象是文本,因此它在各種文本編輯器場合都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達式來處理文本內容。