Regex 正規表示法 - 錨點符號 (Anchors)
錨點符號 (anchor) 是用來表示「定位」的樣式,不用來比對字元,本身不佔據任何字元位置。
^...
beginning
^
用來表示只匹配以 ... 「開頭」的字串。
例子:
^hello
可以用來匹配 "hello world" 字串,但不能匹配 "say hello 123",因為 hello 出現在 "hello world" 的開頭,但 "say hello 123" 的 hello 不在開頭。
但要特別注意在「多行」的字串中,像是:
101
hello Mike
^hello
無法用來匹配上面的字串,因為其 hello 不在開頭的位置!但你可以加上 m 修飾詞 (flag) 讓 ^
改成匹配「行首」,例如 /^hello/m
即可用來匹配上面的字串。
JavaScript 使用範例
/^hello/.test('hello world'); // true
/^hello/.test('say hello 123'); // false
Python 使用範例
import re
bool(re.search('^hello', 'hello world')) # True
bool(re.search('^hello', 'say hello 123')) # False
PHP 使用範例
preg_match('/^hello/', 'hello world'); // 1
preg_match('/^hello/', 'say hello 123'); // 0
Ruby 使用範例
/^hello/ =~ 'hello world' # 0
/^hello/ =~ 'say hello 123' # nil
...$
end
$
用來表示只匹配以 ... 「結尾」的字串。
例子:
foo$
可以用來匹配 "bar foo" 字串,但不能匹配 "foo bar",因為 foo 出現在 "bar foo" 的結尾,但 "foo bar" 的 foo 不在結尾。
但要特別注意在「多行」的字串中,像是:
123 foo
456
foo$
無法用來匹配上面的字串,因為其 foo 不在結尾的位置!但你可以加上 m 修飾詞 (flag) 讓 $
改成匹配「行尾」,例如 /foo$/m
即可用來匹配上面的字串。
JavaScript 使用範例
/foo$/.test('bar foo'); // true
/foo$/.test('foo bar'); // false
Python 使用範例
import re
bool(re.search('foo$', 'bar foo')) # True
bool(re.search('foo$', 'foo bar')) # False
PHP 使用範例
preg_match('/foo$/', 'bar foo'); // 1
preg_match('/foo$/', 'foo bar'); // 0
Ruby 使用範例
/foo$/ =~ 'bar foo' # 4
/foo$/ =~ 'foo bar' # nil
\b
word boundary
\b
用來匹配單字邊界 (word boundary),表示字元的「前面」或「後面」除了空白字元 (whitespace)、標點符號 (punctuation) 或是在字串開頭或結尾外不可再有其它字元。
\w
的字元。例子:
llo\b
可以用來匹配 "hello world", "hello\nworld", "hello", "hello, Mike",但不能用來匹配 "hello_world", "helloworld", "hello101"。
\bworld\b
可以用來匹配 "hello world", "hello~world", "world",但不能用來匹配 "helloworld", "01world"。
JavaScript 使用範例
/llo\b/.test('hello world'); // true
/llo\b/.test('hello_world'); // false
Python 使用範例
import re
bool(re.search(r'llo\b', 'hello world')) # True
bool(re.search(r'llo\b', 'hello_world')) # False
PHP 使用範例
preg_match('/llo\b/', 'hello world'); // 1
preg_match('/llo\b/', 'hello_world'); // 0
Ruby 使用範例
/llo\b/ =~ 'hello world' # 2
/llo\b/ =~ 'hello_world' # nil
\B
not word boundary
\B
則是相對於 \b
,用來匹配非單字邊界 (word boundary)。
例子:
llo\B
可以用來匹配 "hello_world", "helloworld", "hello101",但不能用來匹配 "hello world", "hello\nworld", "hello", "hello, Mike"。
\Bworld\B
可以用來匹配 "123worldxyz",但不能用來匹配 "helloworld", "hello world", "world"。
JavaScript 使用範例
/llo\B/.test('hello world'); // false
/llo\B/.test('hello_world'); // true
Python 使用範例
import re
bool(re.search(r'llo\B', 'hello world')) # False
bool(re.search(r'llo\B', 'hello_world')) # True
PHP 使用範例
preg_match('/llo\B/', 'hello world'); // 0
preg_match('/llo\B/', 'hello_world'); // 1
Ruby 使用範例
/llo\B/ =~ 'hello world' # nil
/llo\B/ =~ 'hello_world' # 2