幫助:正則表達式
“ | 正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。 | ” |
——維基百科 |
本文介紹的大部分正則語法,在不同的正則表達式引擎中都可以使用,但也有一些會有所差異。僅會進行基礎性講解,畢竟深層次的也不會來萌百找。
如要在萌百使用,見段落在萌百。
可利用萌百的默認編輯器在沙盒中測試,或者在正則表達式測試網站(RegExr/Rubular)中測試(推薦)。
基本語法
學習正則表達式的最好方法是理解例子後再自己對例子進行修改、實驗。
一個最簡單的匹配例子:ab
,在大部分正則工具中,都有忽略大小寫的選項,所以它會匹配ab
、aB
、Ab
、AB
,而在沒有忽略大小寫的匹配中,它僅僅只能匹配ab
。
不過通過正則表達式中的元字符,它就可以匹配更多...
元字符
元字符能匹配除其本身之外的更多東西,舉個例子:
.
:匹配換行符(\n
)外所有字符,如h.b
能匹配
hab
hfb
h
b
這就是一個典型的元字符,其中提到了不能匹配的\n
,也是一個元字符。
\n
:匹配換行,如uwh\npo
能匹配
uwh
po
uwhpo
你也可以嘗試以下這些常用的元字符來深入了解正則:
\w
:匹配字母不分大小寫、數字或下劃線[1],如\wu\wb\w
能匹配
au_b4
_uhb5
啊u b不
au bb
也就是說它不能匹配漢字或空格。
\d
:匹配純數字,如yuo\dliu
能匹配
yuo7liu
yuo2liu
yuowliu
yuo你liu
\s
:匹配空白字符(包括\n \f\r\t\v
,其中一些後面會談到),如\s\s
能匹配
y
\uXXXX
:匹配Unicode字符,其中XXXX
為四位16進制數字,可見網站(英文)Regex Tutorial - Unicode Characters and Properties,建議在學完本單元後慢慢了解。此處放一些例子,\u4e00
僅匹配漢字「一」
一
二
單詞邊界
以下介紹兩個特殊的元字符:
^
:匹配字符串的開始;$
:匹配字符串的結束,根據概念很難理解,那舉些例子:
642
能匹配
4254642
42546424254
6424254
642
145
但^642$
只能匹配
4254642
42546424254
6424254
642
145
還有些類似的
\b
、\y
:匹配單詞開始或結束處[2],類似於^
和$
之一。如\b\w5\w
會匹配
a5das
4461854274
44424a5a
b5a
以下這些同樣是元字符,但它有了更多的用法...
字符轉義
如果你想查找元字符本身的話,比如你查找.
,就出現了問題:你沒辦法找到它們,因為它們會被解釋未元字符的意義。這時你就得使用
\
來取消這些字符的特殊意義。如\\
匹配
\d
重複
你是不是感覺\w\w\w\w
太累贅了,那就使用以下元字符吧:
*
:重複零次或更多次;+
:重複一次或更多次;?
:重複零次或一次,不懂?邊講邊練練。
如啊5*啊
,匹不匹配5
或多個都一樣:
啊5啊
啊5555555555555啊
啊啊
啊6啊
同一個例子,換成啊5+啊
就不一樣了:
啊5啊
啊5555555555555啊
啊啊
啊6啊
還是同一個例子,換成啊5?啊
又雙叒叕不一樣了:
啊5啊
啊5555555555555啊
啊啊
啊6啊
看明白例子了嗎?其實很簡單的。明白了後還有另一類重複方式:
{n}
:重複n次,可以看做一個數的集合;{n,}
:重複n次或更多次,類似區間$[n,+∞)$(當然學校沒學到就往下看);{n,m}
:重複n到m次,類似區間$[n,m]$。
如啊5{1}啊
只能匹配到1個5
的
啊5啊
啊5555555555555啊
啊啊
啊6啊
而啊5{1,}啊
能匹配到大於等於1個5
的
啊5啊
啊5555555555555啊
啊啊
啊6啊
同理,啊5{0,}啊
能匹配到大於等於0個5
的
啊5啊
啊5555555555555啊
啊啊
啊6啊
而啊5{0,1}啊
能匹配到大於等於0個、小於等於1個5
的
啊5啊
啊5555555555555啊
啊啊
啊6啊
字符類
如果你想匹配沒有預定義元字符的字符集合...
[xyz]
:字符集合,匹配所包含的任意一個字符,如,你想找字母「a」、數字「6」、漢字「貓」和符號「?」,就可以用[a6猫?]
:
啊a468448d
so6
噬元獸是貓娘
是嗎?
嫌寫太多?可以這樣簡寫一點:
[a-z]
:字符範圍,匹配指定範圍內的任意字符,如果想找「f」到「p」的英文字母,就可以用[f-p]
:
ab14cb4gq
454awahaas
f
**k
當然,你可以同時使用,如[. a-c1-4]
7588746568
eyhtr.ghyuy
iyreh poijlio
人設就誒聽b額皮膚
同時,\uXXXX
也是能指定範圍,如[\u4e00-\uf9a5]+
可以匹配所有中文字符
其實,\w
相當於[A-Za-z0-9_]
,\d
相當於[0-9]
,\s
相當於[ \f\n\r\t\v]
。
用上面的例子,[A-Za-z0-9_]u[A-Za-z0-9_]b[A-Za-z0-9_]
也能匹配
au_b4
_uhb5
啊u b不
au bb
上面舉例的這些其實都是方括號表達式,方括號表達式定義了一個字符序列,所以它的操作可以非常複雜
- 併集,方括號表達式可以像集合那樣操作,所以,你想要匹配兩個方括號表達式的併集,可以這樣做:
[0-3[6-9]]
,可以匹配[3]
7
2
5
有時候,我們想找的不屬於某個能簡單定義的字符類的字符怎麼辦呢?
反義
[^x]
:匹配除了x以外的字符,如[^a-zA-Z]+
能匹配
adsasafsa4245%(#*&42adfsaf
uyhkuyhk按發@)$*放shrgs
\D
:匹配一個非數字字符,等價於[^\d]
或[^0-9]
,如\D+
能匹配
720720adfs)(#%*af428738393
75085720按@$()*發放4542354
\W
:匹配非字母不分大小寫、數字或下劃線[1][^\w]
,如\W+\w+\W+
能匹配
72__OHSF)fhf(#%*4afaf73ADA93
75afva720按@$(452)*發放4542354
\S
:匹配非空白符的字符,等價於[^\s]
,而[\S\s]+
就能匹配全文
4eaohfoUIDAGUI648
sfukhkuse)$@*(&@4)sofeho adda
)()*&¥@)()@¥*58
- 差集,如果匹配差集,實質上就是減操作,如
[a-z&&[^m-r]]
可以匹配
c
z
o
如果想查找多次,那我們有什麼簡便方法嗎?
分枝條件
x|y
:有x條件和y條件,滿足其中任意一種條件都能匹配,對整個正則表達式生效,如abc|123
可以匹配
gkytgkc79876
seydut276877687
有了這個,我們可以將多次查詢綜合成一次查詢,如新曲|知名度|歌姫|涙
可以匹配
謎(知名度的な意味で)のP集団によって
奇跡の新曲が生み出されようとしている。
われらの歌姫が名作絵本のコンセプトをもとに歌い上げる、
感動巨編一大スペクタクル
止まらぬ涙・そして謎の物体
スイミーとは…オランダ出身の絵本作家レオ・レオニ (Leo Lionni) 作の名作絵本。
他の仲間と違い一匹だけ真っ黒な小魚・スイミーが、仲間たちと協力し合って
自分の何十倍もの大きさの魚に立ち向かう、勇気と友情の物語。
有人說,想用<div>.+</div>
匹配<div><div></div></div>
中內層div
,卻把全文匹配了,為什麼?因為
貪婪之罪和怠惰之罪
*?
:重複任意次,但儘可能少重複;+?
:重複1次或更多次,但儘可能少重複;??
:重複0次或1次,但儘可能少重複;{n,m}?
:重複n到m次,但儘可能少重複;{n,}?
:重複n次以上,但儘可能少重複。
通過一段話和b[ab]*b
來區分不同的效果
bbbabaabaabaaabaaaab
沒有?
,它會一次匹配完b[ab]*b
:
bbbabaabaabaaabaaaab
有了?
,它四次才匹配完b[ab]*?b
:
bb
babaa
baabaaa
baaaab
這時候有人說了,哎呀你這個|
在有相同內容時總是要重複寫...
分組語法
(abc)
:將小括號內的內容視為一個整體,並捕獲文本到自動命名組「x」里;(?:abc)
:非捕獲組,內容不會被捕獲,也不會占用捕獲組的序號,僅用於條件判斷。a(?:x|y)c
:分枝條件僅對小括號內生效。
沒學這個之前,寫累贅的寫成絶対絶対絶対絶対絶対|僕は絶対|そして絶対
,現在,寫成((?:絶対){4}|僕は|そして)絶対
也能達到同樣效果
僕は絶対
絶対絶対絶対絶対絶対
何者にもなれず
繰り返してく街の中で窒息する
そして絶対
絶対絶対絶対絶対
Unicode、POSIX
![]() |
本段落之全部或部分原來自中文維基百科的正則表達式,依 CC BY-SA 3.0 授權引入;原貢獻者可以在這裡看到。 |
Unicode處理 | |||
---|---|---|---|
Unicode Property: 字符屬於標點、空格、字母等等,每個Unicode字符只能屬於唯一Unicode Property。 |
字符\p{L} |
\p{Ll} 或\p{Lowercase_Letter} |
小寫字符(必須有大寫的形式) |
\p{Lu} 或\p{Uppercase_Letter} |
大寫字符(必須有小寫的形式) | ||
\p{Lt} 或\p{Titlecase_Letter} |
全詞首字母大寫的字符 | ||
\p{L&} 或\p{Cased_Letter} |
存在大小寫形式的字符 | ||
\p{Lm} 或\p{Modifier_Letter} |
音標修飾字符 | ||
\p{Lo} 或\p{Other_Letter} |
不具有大小寫的字符或字形 | ||
附加符號\p{M} |
\p{Mn} 或\p{Non_Spacing_Mark} |
與其他字符結合,不額外占用空間的字符 | |
\p{Mc} 或\p{Spacing_Combining_Mark} |
與其他字符結合,額外占用空間的字符 | ||
\p{Me} 或\p{Enclosing_Mark} |
包含其他字符的字符 | ||
分隔符\p{Z} |
\p{Zs} 或\p{Space_Separator} |
不可見的空格,但占據空間 | |
\p{Zl} 或\p{Line_Separator} |
分隔線字符U+2028 | ||
\p{Zp} 或\p{Paragraph_Separator} |
分段字符U+2029 | ||
符號\p{S} |
\p{Sm} 或\p{Math_Symbol} |
數學符號 | |
\p{Sc} 或\p{Currency_Symbol} |
通貨符號 | ||
\p{Sk} 或\p{Modifier_Symbol} |
組合為其他字符的符號 | ||
\p{So} 或\p{Other_Symbol} |
其他符號 | ||
數值字符\p{N} |
\p{Nd} 或\p{Decimal_Digit_Number} |
所有文本中的數字0至9字符,不含形意符號 | |
\p{Nl} 或\p{Letter_Number} |
看起來像字母的符號,包含羅馬數字 | ||
\p{No} 或\p{Other_Number} |
上角標或下角標數字,或者其他不屬於0至9的數字,不含形意符號 | ||
標點符號\p{P} |
\p{Pd} 或\p{Dash_Punctuation} |
任何種類的連字號或連接號 | |
\p{Ps} 或\p{Open_Punctuation} |
任何種類開括號 | ||
\p{Pe} 或\p{Close_Punctuation} |
任何種類閉括號 | ||
\p{Pi} 或\p{Initial_Punctuation} |
任何種類開引號 | ||
\p{Pf} 或\p{Final_Punctuation} |
任何種類閉引號 | ||
\p{Pc} 或\p{Connector_Punctuation} |
連接詞的標點符號 | ||
\p{Po} 或\p{Other_Punctuation} |
其他標點符號 | ||
其它符號\p{C} (包括不可見控制字符與未用碼位) |
\p{Cc} 或\p{Control} |
ASCII或Latin-1控制字符0x00-0x1F 與0x7F-0x9F
| |
\p{Cf} 或\p{Format} |
不可見的格式化指示字符 | ||
\p{Co} 或\p{Private_Use} |
私用碼位 | ||
\p{Cs} 或\p{Surrogate} |
UTF-16編碼的代理對的一半 | ||
\p{Cn} 或\p{Unassigned} |
未被使用的碼位 | ||
Unicode Block:按照編碼區間劃分Unicode字符,每個Unicode Block中的字符編碼屬於一個編碼區間 | Unicode Script:按照字符所屬的書寫系統來劃分Unicode字符 | ||
POSIX字符組 | |||
POSIX字符組 | 說明 | ASCII環境 | Unicode環境 |
[:alnum:] |
字母字符和數字字符 | [a-zA-Z0-9] |
[\p{L&}\p{Nd}]
|
[:alpha:] |
字母 | [a-zA-Z] |
\p{L&}
|
[:ascii:] |
ASCII字符 | [\x00-\x7F] |
\p{InBasicLatin}
|
[:blank:] |
空格字符和制表符 | [ \t] |
[\p{Zs}\t]
|
[:cntrl:] |
控制字符 | [\x00-\x1F\x7F] |
\p{Cc}
|
[:digit:] |
數字字符 | [0-9] |
\p{Nd}
|
[:graph:] |
空白字符之外的字符 | [\x21-\x7E] |
[^\p{Z}\p{C}]
|
[:lower:] |
小寫字母字符 | [a-z] |
\p{Ll}
|
[:print:] |
類似[:graph:] ,但包括空白字符 |
[\x20-\x7E] |
\P{C}
|
[:punct:] |
標點符號 | [][!"#$%&'()*+,./:;<=>?@\^_`{|}~-] |
[\p{P}\p{S}]
|
[:space:] |
空白字符 | [ \t\r\n\v\f] |
[\p{Z}\t\r\n\v\f]
|
[:upper:] |
大寫字母字符 | [A-Z] |
\p{Lu}
|
[:word:] |
字母字符 | [A-Za-z0-9_] |
[\p{L}\p{N}\p{Pc}]
|
[:xdigit:] |
十六進制字符 | [A-Fa-f0-9] |
[A-Fa-f0-9]
|
其它
- 摘自正則表達式引擎/風味對比(更新時間:2019-11-27),有改動。
字符 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\ 轉義單個元字符 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
\Q...\E 轉義多個元字符 |
是 | 否 | Java 6 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\x00 ~ \xFF (ASCII 字符) |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\n (換行), \r (回車), \t (制表) |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 是 | 是 |
\f (換頁), \v (豎直制表) |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\a (響鈴) |
是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\e (轉義) |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\b (退格), \B (反斜槓, \ ) |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\cA ~ \cZ (控制字符) |
是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\ca ~ \cz (控制字符) |
是 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
字符類/字符集 [abc]
| |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
[abc] 字符類 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
[^abc] 反義字符類 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
[a-z] 字符類範圍 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
[\d-z] 中的 - 視為字面量 |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
[a-\d] 中的 - 視為字面量 |
是 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\ 轉義單個字符類元字符 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 是 | 是 |
\Q...\E 轉義多個字符類元字符 |
是 | 否 | Java 6 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\d 代表數字 |
是 | 是 | ASCII | 是 | ASCII | ASCII | 需配置 | ASCII | 是 | 否 | 否 | 否 | 否 | 是 | 是 |
\w 代表單詞字符 |
是 | 是 | ASCII | 是 | ASCII | ASCII | 需配置 | ASCII | 是 | 否 | 否 | 是 | 是 | 是 | 是 |
\s 代表空白字符 |
是 | 是 | ASCII | 是 | ASCII | 是 | 需配置 | ASCII | 是 | 否 | 否 | 是 | 是 | ASCII | ASCII |
\D 、\W 和 \S 代表反義字符類 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 是 | 是 | 是 |
[\b] 匹配反斜槓 (\ ) |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
點 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
. 匹配換行符 (\n ) 外所有字符 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
錨點 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
^ 字符串/行開始 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 |
$ 字符串/行結束 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 |
\A 字符串開始 |
是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\Z 字符串結束,最後一個 \n 前 |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\z 字符串結束 |
是 | 是 | 是 | 是 | 是 | 否 | \Z |
是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\` 字符串開始 |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 |
\' 字符串結束 |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 |
單詞邊界 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\b 單詞的開始或結束處 |
是 | 是 | 是 | 是 | ASCII | ASCII | 需配置 | ASCII | 否 | 否 | 否 | 是 | 是 | 否 | 否 |
\B 不是單詞的開始處或結束處 |
是 | 是 | 是 | 是 | ASCII | ASCII | 需配置 | ASCII | 否 | 否 | 否 | 是 | 是 | 否 | 否 |
\y 單詞的開始或結束處 |
是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\Y 不是單詞的開始處或結束處 |
是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\m 單詞的開始處 |
是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\M 單詞的結束處 |
是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\< 單詞的開始處 |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 |
\> 單詞的結束處 |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 |
分支條件 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
| 分支條件 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | \| |
是 | 是 | 是 |
量詞 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
? 0 ~ 1 次 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | \? |
是 | 是 | 是 |
* 0 次或更多次 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 |
+ 1 次或更多次 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | \+ |
是 | 是 | 是 |
{n} n 次 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | \{n\} |
是 | \{n\} |
是 | 是 | 是 |
{n,m} n ~ m 次 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | \{n,m\} |
是 | \{n,m\} |
是 | 是 | 是 |
{n,} n 次或更多次 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | \{n,\} |
是 | \{n,\} |
是 | 是 | 是 |
量詞後加 ? 轉為懶惰模式 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 是 |
分組與後向引用 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(regex) 編號捕獲組 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | \( \) |
是 | \( \) |
是 | 是 | 是 |
(?:regex) 非捕獲組 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\1 ~ \9 後向引用 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 否 | 是 |
\10 ~ \99 後向引用 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | N/A | 否 | 否 | N/A | 是 |
前向引用 \1 ~ \9 |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | N/A | 否 | 否 | N/A | 否 |
嵌套引用 \1 ~ \9 |
是 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 否 | 否 | N/A | 否 | 否 | N/A | 否 |
後向引用不存在的組報錯 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | N/A | 是 | 是 | N/A | 是 |
後向引用匹配失敗的組失敗 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | N/A | 是 | 是 | N/A | 是 |
修飾器 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?i) 忽略大小寫 |
是 | 是 | 是 | 是 | 是 | 僅限 /i |
是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | flag |
(?s) 點 (. ) 可匹配\n |
是 | 是 | 是 | 是 | 是 | 否 | 是 | (?m) |
否 | 否 | 否 | 否 | 否 | 否 | flag |
(?m) 行開始/結束可匹配 ^ / $ |
是 | 是 | 是 | 是 | 是 | 僅限 /m |
是 | always on | 否 | 否 | 否 | 否 | 否 | 否 | flag |
(?x) 忽略空白模式 |
是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | flag |
(?n) 顯式匹配 |
是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?-ismxn) 關閉模式修飾器 |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?ismxn:group) 模式修飾器僅應用於本組 |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
原子組與占位量詞(possessive quantifiers) | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?>regex) 原子組 |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
?+ 、*+ 、++ 、{m,n}+ 占位量詞 |
是 | 否 | 是 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
斷言 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?=regex) 正預測先行斷言 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
(?!regex) 負預測先行斷言 |
是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
(?<=text) 正回顧後發斷言 |
整個表達式 | 整個表達式 | 有限長度 | 固定長度 | 可變固定長度 | 否 | 固定長度 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?<!text) 負回顧後發斷言 |
整個表達式 | 整個表達式 | 有限長度 | 固定長度 | 可變固定長度 | 否 | 固定長度 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
從上個匹配繼續 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\G 匹配嘗試的開始 |
是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
條件 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?(?=regex)then|else) 使用任意斷言 |
是 | 是 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?(regex)then|else) |
否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?(1)then|else) |
是 | 是 | 否 | 是 | 是 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?(group)then|else) |
是 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
注釋 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?#comment) |
是 | 是 | 否 | 是 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
忽略空白 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
支持忽略空白語法 | 是 | 是 | 是 | 是 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 是 |
字符類作為整體 | 是 | 是 | 否 | 是 | 是 | N/A | 是 | 是 | 是 | N/A | N/A | N/A | N/A | N/A | 是 |
# 開啟注釋 |
是 | 是 | 是 | 是 | 是 | N/A | 是 | 是 | 是 | N/A | N/A | N/A | N/A | N/A | 否 |
Unicode 字符 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\X Unicode 字素 |
是 | 否 | 否 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\u0000 ~ \uFFFF (Unicode 字符) |
是 | 是 | 是 | 否 | 否 | 是 | u"string" |
否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 |
\x{0} ~ \x{FFFF} (Unicode 字符) |
是 | 否 | 否 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
Unicode 屬性、腳本與區塊 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\pL ~ \pC (Unicode 屬性) |
是 | 否 | 是 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{L} ~ \p{C} (Unicode 屬性) |
是 | 是 | 是 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 |
\p{Lu} ~ \p{Cn} (Unicode 屬性) |
是 | 是 | 是 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 |
\p{L&} 、\p{Letter&} 等同於 [\p{Lu}\p{Ll}\p{Lt}] Unicode 屬性 |
是 | 否 | 否 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{IsL} ~ \p{IsC} (Unicode 屬性) |
是 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{IsLu} ~ \p{IsCn} (Unicode 屬性) |
是 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{Letter} ~ \p{Other} (Unicode 屬性) |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{Lowercase_Letter} ~ \p{Not_Assigned} (Unicode 屬性) |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{IsLetter} ~ \p{IsOther} (Unicode 屬性) |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{IsLowercase_Letter} ~ \p{IsNot_Assigned} (Unicode 屬性) |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{Arabic} ~ \p{Yi} (Unicode 腳本) |
是 | 否 | 否 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{IsArabic} ~ \p{IsYi} (Unicode 腳本) |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{BasicLatin} ~ \p{Specials} (Unicode 區塊) |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{InBasicLatin} ~ \p{InSpecials} (Unicode 區塊) |
是 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{IsBasicLatin} ~ \p{IsSpecials} (Unicode 區塊) |
是 | 是 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 |
上方 {} 中的內容忽略大小寫 |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
上方語法中長名稱允許空格,邊字符,下劃線 (如 BasicLatin 可寫為 Basic-Latin 、Basic_Latin 或 Basic Latin ) |
是 | 否 | Java 5 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\P 上方所有 \p 的反義 |
是 | 是 | 是 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 |
\p{^...} 上方所有 \p{...} 的反義 |
是 | 否 | 否 | 是 | 需配置 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
命名捕獲與後向引用 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
(?<name>regex) .Net 風格的命名捕獲分組 |
是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?'name'regex) .Net 風格的命名捕獲分組 |
是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\k<name> .Net 風格的命名後向引用 |
是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\k'name' .Net 風格的命名後向引用 |
是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?P<name>regex) Python 風格的命名捕獲分組 |
是 | 否 | 否 | 否 | 是 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
(?P=name) Python 風格的命名後向引用 |
是 | 否 | 否 | 否 | 是 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
多個捕獲組同名 | 是 | 是 | N/A | N/A | 否 | N/A | 否 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
XML 字符類 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
\i 、\I 、\c 、\C XML 名稱字符類 |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 |
[abc-[abc]] 字符類差集 |
是 | 2 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 |
POSIX 方括號表達式 | |||||||||||||||
特性 | JGsoft | .NET | Java | Perl | PCRE | JS | Python | Ruby | Tcl ARE | POSIX BRE | POSIX ERE | GNU BRE | GNU ERE | XML | XPath |
[:alpha:] POSIX 字符類 |
是 | 否 | 否 | 是 | ASCII | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 |
\p{Alpha} POSIX 字符類 |
是 | 否 | ASCII | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
\p{IsAlpha} POSIX 字符類 |
是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
[.span-ll.] POSIX 排序序列 |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 否 | 否 |
[=x=] POSIX 等值字符 |
否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 否 | 否 |
- ↑ 1.0 1.1 有些引擎中
\w
是可以匹配漢字的,這裡以不匹配漢字作為參考。 - ↑ 2.0 2.1 2.2 2.3 2.4 除
^
、$
和\b
外的其它單詞邊界在不同引擎中適用性範圍窄,一般不使用。 - ↑ 其實在大部分引擎中可以這樣寫:
[0-36-9]
。 - ↑ 取自微軟-正則表達式 2 (re2.h) 語法。
- ↑ 命名字符類。對於C++11的regex_traits::lookup_classname,缺省返回字符類的名字:"alnum", "apha", "blank", "cntrl", "digit", "graph", "lower", "print", "punct", "space", "upper", "xdigit", "d", "s", "w",取自維基百科。
在萌百
使用正則表達式編輯
在萌百,你可以在編輯器中使用正則語法進行替換,只需要打開默認編輯器中的「高級」,點擊最右側的圖標,並在彈出的窗口中勾選「使用正則表達式」。
同時各種編輯器,如Wiki+、IPE等也均支持使用正則表達式進行查找的替換。
在模板/頁面中使用正則表達式
萌百有一系列模板可以進行正則表達式的匹配和替換,其中{{regex}}調用了PHP的正則表達式,功能最為強大,而其他模板(如{{Str test}}、{{Str match}}、{{Str replace}}等)則使用的是Lua正則表達式,無法實現部分功能,而且還要占用Lua運行限時。關於這些模板的使用可以直接查看對應模板的文檔,在此不再贅述。
|