假設我們有一個像 +7(903)-123-45-67
的字串,並想要找出其中的所有數字。但與之前不同的是,我們感興趣的不是單獨的數字,而是完整的數字:7, 903, 123, 45, 67
。
數字是一個或多個數字 \d
的序列。為了標示我們需要多少個,我們可以附加一個量詞。
數量 {n}
最簡單的量詞是使用大括號括起來的數字:{n}
。
量詞附加在一個字元(或字元類別,或 [...]
集合等)之後,並指定我們需要多少個。
它有幾個進階形式,我們來看一些範例
- 精確計數:
{5}
-
\d{5}
表示精確的 5 個數字,與\d\d\d\d\d
相同。以下範例尋找 5 位數
alert( "I'm 12345 years old".match(/\d{5}/) ); // "12345"
我們可以加入
\b
排除較長的數字:\b\d{5}\b
。 - 範圍:
{3,5}
,比對 3-5 次 -
若要尋找 3 到 5 位數,我們可以將限制放入大括弧中:
\d{3,5}
alert( "I'm not 12, but 1234 years old".match(/\d{3,5}/) ); // "1234"
我們可以省略上限。
然後正規表示法
\d{3,}
尋找長度為3
或以上的數字序列alert( "I'm not 12, but 345678 years old".match(/\d{3,}/) ); // "345678"
讓我們回到字串 +7(903)-123-45-67
。
數字是一連串一個或多個數字。因此正規表示法為 \d{1,}
let str = "+7(903)-123-45-67";
let numbers = str.match(/\d{1,}/g);
alert(numbers); // 7,903,123,45,67
簡寫
對於大多數使用的量詞,都有簡寫。
+
-
表示「一個或多個」,與
{1,}
相同。例如,
\d+
尋找數字let str = "+7(903)-123-45-67"; alert( str.match(/\d+/g) ); // 7,903,123,45,67
?
-
表示「零個或一個」,與
{0,1}
相同。換句話說,它使符號為選用。例如,樣式
ou?r
尋找o
後接零個或一個u
,然後是r
。因此,
colou?r
找到color
和colour
let str = "Should I write color or colour?"; alert( str.match(/colou?r/g) ); // color, colour
*
-
表示「零個或多個」,與
{0,}
相同。也就是說,字元可以重複多次或不存在。例如,
\d0*
尋找一個數字後接任意數量的零(可以很多或沒有)alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1
將其與
+
(一個或多個)比較alert( "100 10 1".match(/\d0+/g) ); // 100, 10 // 1 not matched, as 0+ requires at least one zero
更多範例
量詞使用非常頻繁。它們是複雜正規表示法的「建構區塊」,因此讓我們看看更多範例。
十進位小數(浮點數)的正規表示法:\d+\.\d+
實際運用
alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345
「不帶屬性的開啟 HTML 標籤」的正規表示法,例如 <span>
或 <p>
。
-
最簡單的:
/<[a-z]+>/i
alert( "<body> ... </body>".match(/<[a-z]+>/gi) ); // <body>
正規表示法尋找字元
'<'
後接一個或多個拉丁字母,然後是'>'
。 -
改良版:
/<[a-z][a-z0-9]*>/i
根據標準,HTML 標籤名稱可以在除了第一個位置以外的任何位置有數字,例如
<h1>
。alert( "<h1>Hi!</h1>".match(/<[a-z][a-z0-9]*>/gi) ); // <h1>
正規表示法「不帶屬性的開啟或關閉 HTML 標籤」:/<\/?[a-z][a-z0-9]*>/i
我們在樣式的開頭附近加入一個選用的斜線 /?
。必須使用反斜線來跳脫它,否則 JavaScript 會認為它是樣式的結尾。
alert( "<h1>Hi!</h1>".match(/<\/?[a-z][a-z0-9]*>/gi) ); // <h1>, </h1>
我們可以在這些範例中看到一個常見的規則:正規表示法越精確,它就越長且越複雜。
例如,對於 HTML 標籤,我們可以使用一個更簡單的正規表示法:<\w+>
。但由於 HTML 對標籤名稱有更嚴格的限制,<[a-z][a-z0-9]*>
較為可靠。
我們可以使用 <\w+>
還是需要 <[a-z][a-z0-9]*>
?
在實際情況中,這兩種變體都是可以接受的。這取決於我們對「額外」比對的容忍度,以及是否難以使用其他方法從結果中移除它們。
留言
<code>
標籤,對於多行程式碼 – 請用<pre>
標籤包覆,對於超過 10 行的程式碼 – 請使用沙盒 (plnkr、jsbin、codepen…)