正則表達式使用筆記

歡迎關注個人公衆號睿Talk,獲取我最新的文章:
clipboard.pngjavascript

1、前言

正則表達式在作一些小工具的時候特別實用,但想掌握好並非一件容易的事情。最近又專門花時間學習了下,順手記錄一些心得。java

2、筆記

{ } [ ] / \ + * . $ ^ | ?正則表達式

元字符 描述
. 句號匹配任意單個字符除了換行符.
[ ] 字符種類. 匹配方括號內的任意字符.
* 匹配>=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,由於這裏的\1hi,而不是正則\w+網站

非捕獲組主要用於多個字符的匹配,如/(?:foo){1,2}/匹配foo這個單詞連續出現 1 到 2 次。若是寫成/foo{1,2}/,則只會匹配最後一個o1 到 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參數或者每次從新生成一個正則就能解決這一問題。

3、總結

正則表達式博大精深,若是你遇到什麼坑或者有什麼使用心得歡迎留言,你們共同來豐富這篇文章。

相關文章
相關標籤/搜索