歡迎關注個人公衆號睿Talk
,獲取我最新的文章:javascript
正則表達式在作一些小工具的時候特別實用,但想掌握好並非一件容易的事情。最近又專門花時間學習了下,順手記錄一些心得。java
{ } [ ] / \ + * . $ ^ | ?
正則表達式
元字符 | 描述 |
---|---|
. | 句號匹配任意單個字符除了換行符. |
[ ] | 字符種類. 匹配方括號內的任意字符. |
* | 匹配>=0個重複的在*號以前的字符. |
+ | 匹配>=1個重複的+號前的字符. |
? | 標記?以前的字符爲可選. |
{n,m} | 匹配num個大括號以前的字符 (n <= num <= m). |
(xyz) | 字符集, 匹配與 xyz 徹底相等的字符串. |
| | 或運算符,匹配符號前或後的字符. |
\ | 轉義字符,用於匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ | |
^ | 從開始行開始匹配. |
$ | 從末端開始匹配. |
正則表達式默認採用貪婪匹配模式,在該模式下意味着會匹配儘量長的子串。咱們可使用?
來修飾如下字符*, +, ?, {}
,將貪婪匹配模式轉化爲非貪婪匹配模式:app
/.*at/ => The fat cat sat on the mat
/.*?at/ => The fat cat sat on the mat工具
對單個字符的或運算,可使用字符集:
/[aeiou]/ => hello world
或者使用或運算符:
/a|e|i|o|u/ => hello world
但若是是多個字符,只能使用或運算符:
/apple|banana/ => i like apple and banana學習
捕獲組: (x)
,非捕獲組: (?:x)
。測試
捕獲組能夠被引用,引用的時候是實際匹配上的字符,而不是對應的正則。(\w+)\s\1
能夠匹配hi hi
,但不能匹配hi ho
,由於這裏的\1
是hi
,而不是正則\w+
網站
非捕獲組主要用於多個字符的匹配,如/(?:foo){1,2}/
匹配foo
這個單詞連續出現 1 到 2 次。若是寫成/foo{1,2}/
,則只會匹配最後一個o
1 到 2 次,而不是整個單詞。spa
符號 | 描述 | 例子 |
---|---|---|
?= | 正先行斷言-存在 | /g(?=o)/ => go |
?! | 負先行斷言-排除 | /g(?!o)/ => ga |
?<= | 正後發斷言-存在 | /(?<=o)k/ => ok |
?<! | 負後發斷言-排除 | /(?<!o)k/ => gk |
/g
的坑const reg = /hi/g; reg.test("hi dickens"); // true reg.test("hi dickens"); // false reg.test("hi dickens"); // true
同一個正則,同一個字符串,爲何會有不一樣的結果???code
當有/g
參數時,下次運行test
是會基於上一次的匹配位置再繼續匹配後面的字符。
const reg = /hi/g; reg.test("hi dickens"); // true reg.test("hi dickens"); // 繼續匹配後面的字符' dickens',找不到因此返回false reg.test("hi dickens"); // 由於上一次匹配爲 false,重新開始一次匹配,因此返回true
去掉\g
參數或者每次從新生成一個正則就能解決這一問題。
正則表達式博大精深,若是你遇到什麼坑或者有什麼使用心得歡迎留言,你們共同來豐富這篇文章。