Regex 正規表示法 - 量詞與替代 (Quantifiers & Alternation)
量詞 (quantifier) 表示某個條件需要出現的次數。
Plus +
+
表示連續出現 1 次或多次。
例子:
pattern ab+c
可以用來匹配 "abc", "abbc", "abbbc", "abbbbbbc" 等字串,但 "ac", "adc" 不符合。
JavaScript 使用範例
var match = /a+/.exec('caaaaaaandy');
console.log(match[0]); // aaaaaaa
Python 使用範例
import re
match = re.search(r'a+', 'caaaaaaandy')
print(match.group()) # aaaaaaa
PHP 使用範例
preg_match('/a+/', 'caaaaaaandy', $match);
echo $match[0]; // aaaaaaa
Ruby 使用範例
match = 'caaaaaaandy'.match(/a+/)
puts match[0] # aaaaaaa
Star *
*
表示連續出現 0 次或多次。
例子:
pattern ab*c
可以用來匹配 "ac", "abc", "abbc", "abbbc", "abbbbbbc" 等字串,但 "adc", "a123" 不符合。
JavaScript 使用範例
var match = /bo*/.exec('A ghost booooed');
console.log(match[0]); // boooo
Python 使用範例
import re
match = re.search(r'bo*', 'A ghost booooed')
print(match.group()) # boooo
PHP 使用範例
preg_match('/bo*/', 'A ghost booooed', $match);
echo $match[0]; // boooo
Ruby 使用範例
match = 'A ghost booooed'.match(/bo*/)
puts match[0] # boooo
Quantifier {min,max}
{n}
{min,}
Quantifier 有三種寫法:
{min,max}
表示至少連續出現 min 次,但最多連續出現 max 次。{n}
表示要出現 n 次。{min,}
表示至少連續出現 min 次。
例子:
pattern ab{1,3}c
可以用來匹配 "abc", "abbc", "abbbc" 等字串,但 "ac", "abbbbbbc", "adc", "a123" 不符合。
pattern ab{3}c
可以用來匹配 "abbbc" 等字串,但 "ac", "abc", "abbc", "abbbbbbc", "adc", "a123" 不符合。
pattern ab{3,}c
可以用來匹配 "abbbc", "abbbbbbc" 等字串,但 "abc", "abbc", "ac", "adc", "a123" 不符合。
JavaScript 使用範例
var match = /a{1,3}/.exec('caaaaaaandy');
console.log(match[0]); // aaa
Python 使用範例
import re
match = re.search(r'a{1,3}', 'caaaaaaandy')
print(match.group()) # aaa
PHP 使用範例
preg_match('/a{1,3}/', 'caaaaaaandy', $match);
echo $match[0]; // aaa
Ruby 使用範例
match = 'caaaaaaandy'.match(/a{1,3}/)
puts match[0] # aaa
Optional ?
?
表示出現 0 次或 1 次。
例子:
pattern ab?c
可以用來匹配 "ac", "abc" 等字串,但 "abbc", "abbbc", "abbbbbbc", "adc", "a123" 不符合。
JavaScript 使用範例
var match = /e?le?/.exec('angel');
console.log(match[0]); // el
Python 使用範例
import re
match = re.search(r'e?le?', 'angel')
print(match.group()) # el
PHP 使用範例
preg_match('/e?le?/', 'angel', $match);
echo $match[0]; // el
Ruby 使用範例
match = 'angel'.match(/e?le?/)
puts match[0] # el
Lazy ?
對於指定的量詞,Regex 的匹配引擎在預設上,採能匹配越多字就盡量匹配,這一個特性叫做 greedy (貪婪)。
例如,用 pattern (.+)(\d+)
來匹配字串 "abcd1234",group 1 會得到 "abcd123",group 2 會得到 "4",正是因為 greedy 的特性讓 .+
匹配到盡可能多的字。
?
還有另外一個用法,接在量詞後面 (+?
, *?
, {min,max}?
, ??
) 表示 lazy (非貪婪, 懶惰) 模式,會使 Regex 的匹配引擎變成以匹配越少字為原則,盡可能匹配短結果。
例如,用 pattern (.+?)(\d+)
來匹配字串 "abcd1234",group 1 會得到 "abcd",group 2 會得到 "1234",正是因為 lazy 的特性讓 .+
匹配到盡可能少的字。
JavaScript 使用範例
var match = /<.+?>/.exec('<em>Hello World</em>');
console.log(match[0]); // <em>
Python 使用範例
import re
match = re.search(r'<.+?>', '<em>Hello World</em>')
print(match.group()) # <em>
PHP 使用範例
preg_match('/<.+?>/', '<em>Hello World</em>', $match);
echo $match[0]; // <em>
Ruby 使用範例
match = '<em>Hello World</em>'.match(/<.+?>/)
puts match[0] # <em>
Alternation |
|
語法用來表示替代的意思,有點像是 boolean OR (或),當你有多個可能的選擇性時,可以用 |
來分隔開多個選擇。
例子:
pattern b(a|e|i)d
表示 b 和 d 之間可能會出現 a, e 或 i 字元,可以用來匹配 "bad", "bed", "bid" 等字串,但 "bd", "bbd", "b123", "bzd" 不符合。
JavaScript 使用範例
var match = /green|red/.exec('green apple');
console.log(match[0]); // green
Python 使用範例
import re
match = re.search(r'green|red', 'green apple')
print(match.group()) # green
PHP 使用範例
preg_match('/green|red/', 'green apple', $match);
echo $match[0]; // green
Ruby 使用範例
match = 'green apple'.match(/green|red/)
puts match[0] # green