正則表達式

簡介

正則表達式(Regular Expressions, regex)根據唔同嘅標準可以分為以下幾類。

類型縮寫全稱
基本正則表達式BREBRE,Basic Regular Expressions
擴展正則表達式EREERE,Extended Regular Expressions
Perl 正則表達式PCREPerl-Compatible Regular Expressions
POSIX 正則表達式BRE & EREBRE & ERE

BRE 同 ERE 係 POSIX 標準入面嘅兩種正則表達式, BRE 比較基礎,需要對某啲元字符轉義,ERE 係 BRE 嘅擴展,提供咗更多嘅元字符同功能。 PCRE 係一種功能更強大、語法更靈活嘅正則表達式類型, 廣泛用於現代編程語言如:Python、Ruby、Javascript。

SED 命令

支持 BRE 同 ERE,默認使用 BRE。

BRE 模式

呢種模式需要對元字符進行轉義,例如:

  • ):需要使用 \) 轉義。
  • |:需要使用 \| 轉義。
echo 'abc' | sed 's/\(b\|c\)/p/g'
app

ERE 模式

使用 -E-r 選項啟用 ERE,唔需要轉義元字符。

echo 'abc' | sed -E 's/(b|c)/p/g'
app

GAWK

默認使用 ERE 模式。

echo 'abc' | gawk '{gsub(/(b|c)/, "p"); print }'
app

特殊字符

有特殊含意嘅字符,需要轉義。

.*[]^${}\+?|()

雖然 / 唔係正則表達式特殊字符,但喺 sedgawk 入面都要轉義。

行首 ^

匹配行嘅首部位置。

echo 'aa bb' | sed -n '/^aa/p'

如果 ^ 唔係出現喺開頭,則同普通字符一樣,無須轉義。

echo 'aa b^b' | sed -n '/b^/p'

行尾 $

匹配行嘅尾部位置。

echo 'aa bb' | sed -n '/bb$/p'

如果 $ 唔係出現喺結尾,則同普通字符一樣,無須轉義。

echo 'aa b$b' | sed -n '/b$b/p'

點字符 .

匹配除換行符外嘅任意單個字符。

echo 'abc' | sed -n '/a.c/p'

字符組 []

Character Class,可以匹配組內任一字符。

echo 'cat' | sed -n '/[ch]at/p'
echo 'yes' | sed -n '/[Yy][Ee][Ss]/p'

排除組內字符。

echo 'bat' | sed -n '/[^ch]at/p'

匹配 c - e 之間嘅字符。

echo 'cat' | sed -n '/[c-e]at/p'

匹配 c - e0 - 9 之間嘅字符。

echo 'cat' | sed -n '/[c-e0-9]at/p'

星號 *

匹配 * 號前面嘅字符 0 次或多次。

echo '24' | sed -n '/23*4/p'
echo '234' | sed -n '/23*4/p'
echo '2334' | sed -n '/23*4/p'
echo 'bat' | sed -n '/b[ae]*/p'
echo 'baaeeaet' | sed -n '/b[ae]*/p'

以上例子都係可以成功匹配嘅。

問號 ?

匹配 ? 號前面嘅字符 0 次或 1 次。

echo 'at' | sed -En '/c?at/p'
echo 'ccbbat' | sed -En '/c?at/p'

上面嘅例子都係可以匹配嘅,可以用 ^ 限制。

echo 'ccbbat' | sed -En '/^c?at/p'

上面只能匹配 at 或 cat。

加號 +

匹配 + 號前面嘅字符 1 次或多次。

echo 'at' | sed -En '/c+at/p'

區間

指定 {} 前面字符嘅匹配次數。

echo 'cat' | sed -En '/^c{1}at/p'
echo 'ccat' | sed -En '/^c{1,2}at/p'

竪線 |

表示或邏輯。

echo 'cat' | sed -En '/cat|hat/p'

分組 ()

分組可以視為一個整體。

echo 'cat' | sed -En '/(c|h)at/p'
echo 'Sun' | sed -En '/(S|s)un(day)?/p'