[regex] regexp? Regular Expression 正規表達式 筆記

[A-Z]

[A-Z] 🡺 A B C ... Z
[0-9] 🡺 0 1 2 ... 9
[c-g] 🡺 c d ... f g

\ Escape

\d 🡺 數字
\D 🡺 非數字
\w 🡺 A~Z a~z 0~9
\w 🡺 非 \w
\s 🡺 空格
\S 🡺 非空格
\\ 🡺 \
\$ 🡺 $

對於不同的狀況,
有些原本不用逃脫的字符也會因為使用的程式的關係要逃脫,
例如說我想在 Atom 中搜索協議為 http 或 https 的 URL
atom-regex-url
在 vim 中
vim-regex-url

Quantifiers

? ( 0 或 1 個 )

regexp? 🡺 regex regexp

+ ( 1 到無限個 )

ab+c 🡺 abc abbc abbbc ...

* ( 0 到無限個 )

ab*c 🡺 ac abc abbc ...

{4, 10} ( 4 到 10 個 )

\d{4,10} 🡺 1234 345678 0987654321 ...

{10} ( 10 個 )

\d{10} 🡺 0935120188 ...

{6,} ( 6 到 無限 個 )

\d{6,} 🡺 000000 1111111111 ...

Greedy ( 能匹配到多少就多少 )

Quantifiers 默認都是 greedy mode 的

例如說:
匹配字串 AAAAA
Pattern A+ 🡺 AAAAA

Lazy ( 能多少就多少 )

如果再 quantifier 後面加上 ? 就會變成 Lazy mode

例如:
匹配字串 AAAAA
Pattern A+? 🡺 會找到第一個 A 或是 5 個 A (取決於你用的程式)

Capturing Groups

(ABC)+ 🡺 ABC ABCABC ...

Or

(A|B)C 🡺 AC BC
(A|B){2}C 🡺 AAC ABC BAC BBC

Back-Reference \1

抓引號中的內容:
(['"])(\\?\.)*?\1 🡺 "" "123" "This's \"regex\"." '456'

在有些支持 regex 搜尋替代的編輯器中 (像是 Atom)
在替換欄可以用 $ 加數字來引用搜尋的內容

假設在文本

Here's
a
simple
text
file.
"and some quotes"
'single quote '

(['"])(\\?\.)*?\1 來搜尋
並在替換欄上輸入 ~~~$2~~~
全文替換後就會變成

Here's
a
simple
text
file.
~~~and some quotes~~~
~~~single quote ~~~

$0 表示整個 Pattern 配對到的內容
$1 表示第一個 () 中的內容

如果是巢狀
例如 (1(2(3)))(4(5))
$0 🡺 12345
$1 🡺 123
$2 🡺 23
$3 🡺 3
$4 🡺 45
$5 🡺 5

(?=) (?!) (?<=) (?<!) (?:) Lookaround

(?= ... ) Look ahead positive

A(?=B) 🡺 後面接著 B 的 A

(?! ... ) Look ahead negative

A(?!B) 🡺 後面沒有接著 B 的 A

(?<= ... ) Look behind positive

(?<=B)A 🡺 前面有接著 B 的 A

(?<! ... ) Look behind negative

(?<!B)A 🡺 前面沒有接著 B 的 A

(?: ... ) Non-Capturing Groups

表示不被引用
(?:1)(2)
$1 🡺 2

Anchor

^ 開頭

regex-anchor-1

$ 結尾

regex-anchor-2

Reference

http://www.rexegg.com/regex-quantifiers.html
https://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups

Show Comments