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) 或是在字串開頭或結尾外不可再有其它字元。

word boundary 可以看作是不屬於 \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