目錄
- 1. 正則表達式是個什么東東?
- 1.1 怎么定義正則
- 1.2 對象字面量方式
- 1.3 類創建方式
- 2. 怎么使用
- 2.1 實例方法
- 2.1.1 exec方法
- 2.1.2 test方法
- 2.2 字符串中的方法
- 2.2.1 match/matchAll
- 2.2.2 replace/replaceAll
- 2.2.3 split
- 2.2.4 search
- 3. 規則
- 3.1 修飾符
- 3.2 字符類
- 3.3 錨點(Anchors)
- 3.4 轉義字符串
- 3.5 集合(Sets)和范圍(Ranges)
- 3.6 量詞
- 3.7 捕獲組
- 3.8 貪婪模式和惰性模式
2025,做想做的事,讀想讀的書,持續學習,自律生活,修行人生。
2025一個轉身就已到來,對于時間太快,總會有種惶恐感。每每回首過去,總會發現想要做的事情沒有完成,學習的內容少之又少,讀的有用的書籍更是可以忽略不計。對于內在的超越,內在的修行也是沒有始終踐行,知行合一,實踐、認識、再實踐、再認識…
2025年第1周:2025.01.01 ~ 2025.01.05
目標:JavaScript中的正則表達式,您搞懂了么?這部分內容,不需要深入了了解,但是基本的概念和用法需要掌握。
- 正則表達式是個什么東東?
- 怎么使用?
- 規則有哪些
1. 正則表達式是個什么東東?
我們看一下百度百科上的解釋:
正則表達式(
Regular Expression
):又稱規則表達式,在代碼中常簡寫為regex
、regexp
或RE
。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串,通常被用來檢索、替換那些符合某個模式(規則)的文本。許多程序設計語言都支持利用正則表達式進行字符串操作。
讀了半天,還是懵,說的什么東東?
其實就一句話:在JavaScript中,就是用來進行字符串匹配的,進行搜索、獲取、替代字符串。
1.1 怎么定義正則
那么,怎么定義正則呢?有兩種方式來定義正則:
- 對象字面量方式(常用)
- 使用類
RegExp
創建
正則有兩部分構成:模式、和修飾符。
1.2 對象字面量方式
- 這里面
xxx
:為模式 ig
:為修飾符
// 對象字面量方式創建正則
const regexp = /xxx/ig
1.3 類創建方式
- 使用
RegExp
類來創建
const regexp = new RegExp("xxx", "ig")
2. 怎么使用
有了正則表達式之后,我們要如何使用它呢? 在JavaScript中,主要用于以下兩個場景:
- 類
RegExp
的實例方法:exec
、和test
方法 - 字符串的方法:
match/matchAll
、replace/replaceAll
、search
、split
方法。
2.1 實例方法
2.1.1 exec方法
- exec方法:使用正則,執行一個字符串。
const re1 = /qtz/ig;
const message = "welcom to qtz";const result = re1.exec(message);
console.log(result);// [ 'qtz', index: 10, input: 'welcom to qtz', groups: undefined ]
2.1.2 test方法
test方法:檢測某一個字符串是否符合正則的規則。返回boolean類型。
const regexp = /qtz/ig
const str = "welcome to qtz"
if (regexp.test(str)) {console.log("匹配到了qtz")
}
2.2 字符串中的方法
2.2.1 match/matchAll
- 注意:
matchAll
傳入的正則修飾符,必須加g
,否則會報如下錯誤:
Uncaught TypeError: String.prototype.matchAll called with a non-global RegExp argument
matchAll
返回值:得到是一個迭代器對象(RegExpStringIterator{}
)
const re = /qtz/ig;
const message = "Qtz and qtz or qtz";const result = message.matchAll(re);console.log(result.next());
console.log(result.next());
console.log(result.next());
2.2.2 replace/replaceAll
- 替換字符串
const re1 = /qtz/ig;
const message = "Qtz and qtz or qtz";const result = message.replace(re1, "AAA");
console.log(result); // AAA and AAA or AAA
2.2.3 split
- 字符串分割
const reg = /qtz/ig;
const message = "Qtz and qtz or qtz";const result = message.split(reg);
console.log(result); // [ '', ' and ', ' or ', '' ]
2.2.4 search
- 查找字符串
const reg = /qtz/i;
const message = "HH Qtz and qtz or qtz";const result = message.search(reg);
console.log(result); // 3
3. 規則
3.1 修飾符
- g:全局,匹配所有
- i:忽略大小寫
- m:多行匹配
3.2 字符類
字符類(Character classes)是一個特殊的符號,匹配特定集中的任何符號:
- \d :數字從0到9的字符
- \s:空格符號,包括空格、制表符
\t
、換行符\n
和其他少數稀有字符,例如\v
、\f
和\r
。 - \w:'單字"字符,拉丁字母、數字、下劃線-。相當于
[ a-zA-Z0-9_ ]
- .(點):點
.
是一種特殊字符類,它與“除換行符之外的任何字符”匹配.
反向類(Inverse classes)
- \D 非數字:除 \d 以外的任何字符,例如字母,
- \S 非空格符號:除\s 以外的任何字符,例如字母。
- \W 非單字字符:除 \w 以外的任何字符,例如非拉丁字母或空格,
3.3 錨點(Anchors)
符號^
和符號 $
在正則表達式中具有特殊的意義,它們被稱為“錨點”。
- 符號
^
匹配文本開頭; - 符號
$
匹配文本末尾,
詞邊界(Word boundary)
- 詞邊界
\b
是一種檢査,就像^
和$
一樣,它會檢査字符串中的位置是否是詞邊界。 - 詞邊界測試
\b
檢査位置的一側是否匹配 \w,而另一側則不匹配“\w“
3.4 轉義字符串
如果要把特殊字符作為常規字符來使用,需要對其進行轉義
- 只需要在它前面加個反斜杠
\
常見的需要轉義的字符:
[ ] \ ^ $ . | ? * + ( )
- 斜杠符號
/
并不是一個特殊符號,但是在字面量正則表達式中也需要轉義;
const re = /\//
3.5 集合(Sets)和范圍(Ranges)
有時候我們只要選擇多個匹配字符的其中之一就可以:
- 在方括號
[...]
中的幾個字符或者字符類意味著“搜索給定的字符中的任意一個”.
集合(Sets)
- 比如說,
[eao]
意味著查找在3個字符’a’、'e’或者、'o’中的任意一個;
范圍(Ranges):方括號也可以包含字符范圍
- 比如說,
[a-z]
會匹配從 a到z范圍內的字母,[0-5]
表示從05的數字; [0-9A-F]
表示兩個范圍:它搜索一個字符,滿足數字 0 到 9 或字母 A 到 F- \d :和
[0-9]
相同; - \w:和
[a-zA-Z0-9_]
相同;
3.6 量詞
用來形容我們所需要的數量的詞被稱為量詞(quantifiers)。
數量 {n}
- 確切的位數:
{5}
- 某個范圍的位數:
{3,5}
注意,
號后面不能有空格
簡寫:
+
:代表“一個或多個”,相當于{1,}
?
:代表“零個或一個”,相當于(0,1}
。換句話說,它使得符號變得可選;*
:代表著“零個或多個”,相當于{0,}
。也就是說,這個字符可以多次出現或不出現;
3.7 捕獲組
- 模式的一部分可以用括號括起來
(.)
,這稱為“捕獲組。這有兩個作用:
- 它允許將匹配的一部分作為結果數組中的單獨項,
- 它將括號視為一個整體;
- 命名組:
- 用數字索引記錄組很困難。
- 對于更復雜的模式,計算括號很不方便。我們有一個更好的選擇:給括號起個名字。
- 這是通過在開始括號之后立即放置
?<name>
來完成的。
- 非捕獲組:
- 有時我們需要括號才能正確應用量詞,但我們不希望它們的內容出現在結果中。
- 可以通過在開頭添加
?:
來排除組。
- 或
- 在正則表達式中,它用豎線
|
表示, - 通常會和捕獲組一起來使用,在其中表示多個值
- 與
[aeo]
的區別:中括號是單個字符
3.8 貪婪模式和惰性模式
默認情況下的匹配規則:是查找到匹配的內容后,會繼續向后查找,一直找到最后一個匹配的內容
- 這種匹配的方式,我們稱之為貪婪模式
懶性模式中的量詞與貪婪模式中的是相反的。
- 只要獲取到對應的內容后,就不再繼續向后匹配
- 我們可以在量詞后面再加一個問號
?
來啟用它 - 所以匹配模式變為
*?
或+?
,甚至將?變為??
END !