Regular Expressions正則表達式入門


備註

對於許多程序員來說, 正則表達式是他們用來解決任何類型的文本解析情況的某種神奇劍。但是這個工具並不神奇,即使它的功能很棒,它也不是一個全功能的編程語言( 不是圖靈完備的)。

“正則表達”是什麼意思?

正則表達式表達由常規語法定義的語言,該語法可以通過非確定性有限自動機 (NFA)來解決,其中匹配由狀態表示。

常規語法喬姆斯基層次結構表達的最簡單的語法。

喬姆斯基的等級制度

簡單地說,常規語言通過NFA可以表達的內容直觀地表達,這是NFA的一個非常簡單的例子:

NFA示例

正則表達式語言是這種自動機的文本表示。最後一個例子由以下正則表達式表示:

^[01]*1$

哪個匹配任何以01開頭的字符串,重複0次或更多次,以1結尾。換句話說,它是一個正則表達式,用於匹配二進製表示中的奇數。

所有正則表達式實際上都是常規語法嗎?

實際上他們不是。許多正則表達式引擎已得到改進,並且正在使用下推式自動機 ,它可以堆疊,並在運行時彈出信息。那些自動機在喬姆斯基的層次結構中定義了所謂的無上下文語法 。非常規正則表達式中最典型的用法是使用遞歸模式進行括號匹配。

像下面這樣的遞歸正則表達式(匹配括號)是這樣一個實現的一個例子:

{((?>[^\(\)]+|(?R))*)}

(這個例子不使用Python的工作re引擎,但與regex引擎 ,或與PCRE引擎 )。

資源

有關正則表達式背後理論的更多信息,您可以參考麻省理工學院提供的以下課程:

當您編寫或調試複雜的正則表達式時,有一些在線工具可以幫助將正則表達式可視化為自動機,例如debuggex站點

版本

PCRE

發布
2 2015年1月5日
1 1997年6月1日

使用者: PHP 4.2.0(及更高版本), Delphi XE(及更高版本), JuliaNotepad ++

Perl的

發布
1 1987年12月18日
2 1988年6月5日
3 1989年10月18日
4 1991年3月21日
1994年10月17日
6 2009-07-28

。淨

發布
1 2002年2月13日
4 2010-04-12

語言: C#

Java的

發布
4 2002-02-06
2004-10-04
7 2011-07-07
SE8 2014年3月18日

JavaScript的

發布
1.2 1997年6月11日
1.8.5 2010-07-27

蟒蛇

發布
1.4 1996年10月25日
2.0 2000年10月16日
3.0 2008-12-03
3.5.2 2016年6月7日

Oniguruma

發布
初始 2002-02-25
5.9.6 2014-12-12
Onigmo 2015年1月20日

促進

發布
0 1999年12月14日
1.61.0 2016年5月13日

POSIX

發布
BRE 1997-01-01
ERE 2008-01-01

語言: Bash

角色指南

請注意,某些語法元素根據表達式具有不同的行為。

句法描述
? 匹配前面的字符或子表達式0或1次。還用於非捕獲組和命名捕獲組。
* 匹配前面的字符或子表達式0次或更多次。
+ 將前面的字符或子表達式匹配1次或更多次。
{n} 準確匹配前面的字符或子表達n次。
{min,} 匹配前面的字符或子表達式最少或更多次。
{,max} 最多匹配前面的字符或子表達式或更少次數。
{min,max} 匹配前面的字符或子表達式至少min次但不超過max 次。
- 當包括方括號之間指示to ;例如[3-6]匹配字符3,4,5或6。
^ 字符串的開始(如果指定了multiline /m 選項,則為行的開頭),或者否定選項列表(即,如果在方括號[]
$ 字符串結尾(如果指定了multiline /m 選項,則為行尾)。
( ... ) 組子表達式,捕獲特殊變量( \1\2 等)中的匹配內容,這些變量可以在以後的同一個正則表達式中使用,例如(\w+)\s\1\s 匹配單詞重複
(?<name> ... ) 對子表達式進行分組,並在命名組中捕獲它們
(?: ...... ) 將子表達式分組而不捕獲
. 匹配除換行符之外的任何字符( \n ,通常為\r \n )。
[ ... ] 這些括號之間的任何字符都應匹配一次。注意: ^ 在開放式括號後面否定此效果。 - 在括號內發生允許指定一系列值(除非它是第一個或最後一個字符,在這種情況下它只表示常規短劃線)。
\ 逃避以下角色。也用於元序列 - 具有特殊含義的正則表達式令牌。
\$ 美元(即逃脫的特殊字符)
\( 開括號(即轉義的特殊字符)
\) 閉括號(即逃脫的特殊字符)
\* 星號(即逃脫的特殊字符)
\. 點(即逃脫的特殊字符)
\? 問號(即逃脫的特殊字符)
\[ 左(打開)方括號(即轉義的特殊字符)
\\ 反斜杠(即轉義的特殊字符)
\] 右(關閉)方括號(即逃脫的特殊字符)
\^ 插入符號(即逃脫的特殊字符)
\{ 左(打開)花括號/括號(即轉義的特殊字符)
\| 管道(即逃脫的特殊字符)
\} 右(關閉)花括號/大括號(即逃脫的特殊字符)
\+ 加(即逃脫的特殊字符)
\A 一個字符串的開頭
\Z 一個字符串的結尾
\z 字符串的絕對值
\b 單詞(字母數字序列)邊界
\1\2對以前匹配的子表達式的反向引用,按() 分組, \1 表示第一個匹配, \2 表示第二個匹配等。
[\b] 退格 - 當\b 在字符類( [] )內部匹配退格時
\B 否定\b - 匹配雙字符之間的任何位置以及兩個非單詞字符之間的任何位置
\D 非數字
\d 數字
\e 逃逸
\f 形式飼料
\n 換行
\r 回車
\S 非空白
\s 空白
\t 標籤
\v 垂直標籤
\W 無字
\w 單詞(即字母數字字符)
{ ... } 命名字符集
| 要么;即描述先前和先前的選項。