七日内新公告:全站维护公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

說明:正則表達式

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
跳至導覽 跳至搜尋
這個頁面「Help:正則表達式」是萌娘百科的幫助文檔
  • 本文用於介紹萌娘百科中一些特定功能的操作方法;
  • 本文僅是一篇論述,不屬於方針或指引。如果本指南與相關方針或指引發生衝突或存在不一致的情況,請以方針或指引的條文為準。
“ 正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。 ”
——維基百科

本文介紹的大部分正則語法,在不同的正則表達式引擎中都可以使用,但也有一些會有所差異。僅會進行基礎性講解,畢竟深層次的也不會來萌百找。

如要在萌百使用,見段落在萌百。

可利用萌百的默認編輯器在沙盒中測試,或者在正則表達式測試網站(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

一
二

單詞邊界

以下介紹兩個特殊的元字符:

  • ^:匹配字符串的開始;
  • $:匹配字符串的結束,根據概念很難理解,那舉些例子:

642能匹配

4254642
42546424254
6424254
642
145

但^642$只能匹配

4254642
42546424254
6424254
642
145

還有些類似的

  • \b、\y:匹配單詞開始或結束處[2],類似於^和$之一。如\b\w5\w會匹配

a5das
4461854274
44424a5a
b5a

  • \m、\<:單詞的開始處[2];
  • \>:單詞的結束處[2],由於能用到這些的一般都不會來看這裡的參考,故不做展示。

以下這些同樣是元字符,但它有了更多的用法...

字符轉義

如果你想查找元字符本身的話,比如你查找.,就出現了問題:你沒辦法找到它們,因為它們會被解釋未元字符的意義。這時你就得使用

  • \來取消這些字符的特殊意義。如\\匹配

\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

  • [:name:]:匹配ASCII字符組name[4],增加命名字符類(named character class)[5]中的字符到表達式;
  • [=elt=]:增加當前locale下排序(collate)等價於字符「elt」的元素;
  • [.elt.]:增加排序元素(collation element)elt到表達式中。

有時候,我們想找的不屬於某個能簡單定義的字符類的字符怎麼辦呢?

反義

  • [^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

  • \B、\Y:非單詞開始或結束處[2];
  • \W:單詞的結束處[2]。
  • 差集,如果匹配差集,實質上就是減操作,如[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

Unicode、POSIX
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]

其它

正則表達式引擎/規範特性對比表
字符
特性 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. ↑ 1.0 1.1 有些引擎中\w是可以匹配漢字的,這裡以不匹配漢字作為參考。
  2. ↑ 2.0 2.1 2.2 2.3 2.4 除^、$和\b外的其它單詞邊界在不同引擎中適用性範圍窄,一般不使用。
  3. ↑ 其實在大部分引擎中可以這樣寫:[0-36-9]。
  4. ↑ 取自微軟-正則表達式 2 (re2.h) 語法。
  5. ↑ 命名字符類。對於C++11的regex_traits::lookup_classname,缺省返回字符類的名字:"alnum", "apha", "blank", "cntrl", "digit", "graph", "lower", "print", "punct", "space", "upper", "xdigit", "d", "s", "w",取自維基百科。

在萌百

使用正則表達式編輯

在萌百,你可以在編輯器中使用正則語法進行替換,只需要打開默認編輯器中的「高級」,點擊最右側的圖標,並在彈出的窗口中勾選「使用正則表達式」。

同時各種編輯器,如Wikiplus、InPageEdit等也均支持使用正則表達式進行查找的替換。

在模板/頁面中使用正則表達式

萌百有一系列模板可以進行正則表達式的匹配和替換,其中{{regex}}調用了PHP的正則表達式,功能最為強大,而其他模板(如{{Str test}}、{{Str match}}、{{Str replace}}等)則使用的是Lua正則表達式,無法實現部分功能,而且還要占用Lua運行限時。關於這些模板的使用可以直接查看對應模板的文檔,在此不再贅述。

外部鏈接