天天看點

正規表達式入門指南——示例詳解一看就懂

作者:PrvtSite

前言

在傳統操作字元串的過程中,我們可能通過for、indexOf、lastIndexOf、trim等來實作具體的功能。比如找出字元串中是否有 l ,"hello".indexOf("l") > -1,但是hello可能是大寫HELLO,我們要實作不管大寫還是小寫時,那麼我們需要再增加一串代碼才能實作此功能。那麼如果使用正規表達式的話,這将非常簡單。/[lL]/.test("hello") 或者 /l/i.test("hello") 都可以。

當然正規表達式遠不止于此,這隻是一個非常簡單的例子。

正規表達式主要用于比對字元串,用它神奇的文法來實作字元串的搜尋、替換、過濾、驗證文本資料等操作。在不同程式設計語言及代碼中,我們都能看到它的身影。

當然,不同程式設計語言的正規表達式文法大體是相通的,同時也有一些細微的差别,多多實踐就行。

正規表達式包含普通字元和元字元兩種類型,通俗一點的說,普通字元就是直接比對文本中的字元,比如字母、數字、中文和标點符号等等。而元字元(特殊的字元或正則文法字元)則表示有特殊含義,比如 . 、 ^ 、 $ 、 * 、 + 、 ? 、 \ 、 [] 、 | 等。

下面讓我們一步一步的走進正規表達式。

聲明方式

Javascript的正規表達式的聲明一般有兩種方式。

1、字面量形式聲明,使用兩個斜杠來表示。

const reg = /exp/gim           

2、字元串形式聲明。

const reg = new RegExp('exp', 'gim');           

g、i、m為可選參數,分别代表全局比對、不區分大小寫、多行比對。可以根據實際情況添加使用。

基礎用法

1、字元比對

使用普通字元比對文本。例如,找出world,替換為King,并且不區分大小寫。

const content = 'Hello World!';
// 斜杠後面加 i 表示不區分大小寫
const reg = /world/i;
const result = content.replace(reg, 'King');
console.log(result);
//輸出: 'Hello King!'           

使用 . 比對任何單個字元。例如,把hello或hallo換成大寫HELLO。

const content = 'Hello、hallo';

// 斜杠後面加 i  表示不區分大小寫
const reg = /h.llo/i;
const result = content.replace(reg, 'HELLO');
console.log(result);
//輸出: 'HELLO、hallo'


// 斜杠後面加 g 表示全局比對,也就是比對多次。
// 不加的話表示隻比對一次。
const reg_g = /h.llo/gi;
const result_g = content.replace(reg_g, 'HELLO');
console.log(result_g);
//輸出:'HELLO、HELLO'           

2、字元集

使用方括号來列出可能的字元。

例如,把所有 a、b、c删除,也就是比對a或者b或者c。

const content = 'a1 b1 c1 a2 b2 c2 a3 c3';
const reg = /[abc]/g;
const result = content.replace(reg, '');
console.log(result);
//輸出:'1 1 1 2 2 2 3 3'           

例如,删除所有的小寫字元字母。

const content = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// [a-z]表示a-z所有26個字母,
// 相當于[abcdefghijklmnopqrstuvwxyz]的簡寫。
// 如果還需要删除大寫字母,在斜杠後面添加 i 即可。
const reg = /[a-z]/g;
const result = content.replace(reg, '');
console.log(result);
//輸出:'ABCDEFGHIJKLMNOPQRSTUVWXYZ'           

例如,删除所有非字母的字元。

const content = 'abcd ABCD 123456 中文 ,';
// [^a-z]表示 非 26個字母之外的任何字元。
// 相當于[^abcdefghijklmnopqrstuvwxyz]的簡寫。
const reg = /[^a-z]/gi;
const result = content.replace(reg, '');
console.log(result);
//輸出:'abcdABCD'           

當然您可以根據實際情況,寫出您需要的表達式。

比如:

所有數字: [\d] 或者 [0-9] 。 \d 是一種元字元類别,可以用于比對任何數字字元,包括Unicode整數、全角數字等, [0-9] 隻能比對 ASCII 數字字元 0 到 9。可以根據實際情況選擇哪一種。

任何單詞字元: \w 。 \w 相當于 [a-zA-Z0-9_] ,也就是a-z、A-Z、0-9以及下劃線_

所有漢字字元:[\u4e00-\u9fa5]。 \u4e00 和 \u9fa5 是 Unicode 碼點,分别對應中文編碼範圍的起始和結束字元。當然,一些較為生僻的漢字,或者不同文化的漢字可能不在其中,一般情況下已經夠用了。

所有已知的漢字:

[\u4E00-\u9FFF\u3400-\u4DBF\uF900-\uFAFF\U00020000-\U0002EBEF]

不要驚訝,這個字元範圍包括 [\u4E00-\u9FFF]、[\u3400-\u4DBF]、[\uF900-\uFAFF] 以及 [\U00020000-\U0002EBEF],覆寫了 CJK(中、日、韓)和 CJK 擴充區的所有漢字,并且也包含了一些較為罕見的漢字和方言漢字。這個範圍應該已經可以完整比對目前已知的漢字了。

根據實際情況選擇即可。

3、量詞

量詞表示指定前面的字元或字元集出現的次數。

常見的量詞包括:

  1. “+”:出現一次或多次。
  2. “*”:出現零次或多次。
  3. “?”:出現零次或一次。
  4. “{n}”:剛好出現 n 次。
  5. “{n,}”:出現至少 n 次。
  6. “{n,m}”:出現 n 到 m 次之間。

例如:

比對多個 l 。 [l]+ 等價于 [l]{1,} 。

正規表達式入門指南——示例詳解一看就懂

[l]{1,}

4、描點

錨點用于比對文本的位置,而不是字元本身。

常見的錨點包括:

  1. “^”:比對文本的開頭。
  2. “$”:比對文本的結尾。
  3. “\b”:比對單詞邊界。
  4. “\B”:比對非單詞邊界。

例如: /^hello/ ,比對以hello開頭的字元串。 /hello$/ ,比對以hello結尾的字元串。

正規表達式入門指南——示例詳解一看就懂

/hello/g

正規表達式入門指南——示例詳解一看就懂

/^hello/

正規表達式入門指南——示例詳解一看就懂

進階用法

1、分組

分組可以将正規表達式中的模式組合在一起。

括号 “()” 用于建立組。建立的組可以用于重複、替換等操作。

比如:擷取字元串 prvt_site-123 中的 prvt_site 與 123 。

正規表達式入門指南——示例詳解一看就懂

2、向後引用

向後引用允許你在正規表達式中引用先前建立的組。

可以使用反斜杠 “\n”(其中 n 是組号)來引用組。

比如:查找簡單的閉合HTML标簽。提取标簽名及标簽内的文本。

正規表達式入門指南——示例詳解一看就懂
正規表達式入門指南——示例詳解一看就懂
正規表達式入門指南——示例詳解一看就懂

3、前瞻和後顧:

前瞻和後顧允許你查找隻在特定模式前面或後面的文本。

文法為 “?=”(正向前瞻)、“?!”(負向前瞻)、“?<=”(正向後顧)和 “?<!”(負向後顧)。

例如:擷取收入萬元以上的使用者。

正規表達式入門指南——示例詳解一看就懂

例如:擷取非數字版本作業系統前面的windows。

正規表達式入門指南——示例詳解一看就懂

例如:擷取所有windows的版本号。

正規表達式入門指南——示例詳解一看就懂

例如:擷取所有非windows後面的版本号

正規表達式入門指南——示例詳解一看就懂

4、正規表達式模式修飾符

修飾符用于更改正規表達式的預設行為。

常見的修飾符包括:

  1. “i”:忽略大小寫。
  2. “g”:全局比對。
  3. “m”:多行比對。

上面示例中,您可能已經了解了修飾符的用法,自己動手試試吧!

人人為我,我為人人,歡迎您的浏覽,我們一起加油吧。

繼續閱讀