導航:首頁 > 源碼編譯 > 編譯原理中正則表達式的定義

編譯原理中正則表達式的定義

發布時間:2023-02-16 19:33:53

① 什麼是正則表達式舉例說明一下

目前,正則表達式已經在很多軟體中得到廣泛的應用,包括*nix(Linux, Unix等),HP等操作系統,php,C#,java等開發環境,以及很多的應用軟體中,都可以看到正則表達式的影子。

正則表達式的使用,可以通過簡單的辦法來實現強大的功能。為了簡單有效而又不失強大,造成了正則表達式代碼的難度較大,學習起來也不是很容易,所以需要付出一些努力才行,入門之後參照一定的參考,使用起來還是比較簡單有效的。

例子: ^.+@.+\\..+$

2. 正則表達式的歷史

正則表達式的「祖先」可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網路。
1956 年, 一位叫 Stephen Kleene 的數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了一篇標題為「神經網事件的表示法」的論文,引入了正則表達式的概念。正則表達式就是用來描述他稱為「正則集的代數」的表達式,因此採用「正則表達式」這個術語。

隨後,發現可以將這一工作應用於使用 Ken Thompson 的計算搜索演算法的一些早期研究,Ken Thompson 是 Unix 的主要發明人。正則表達式的第一個實用應用程序就是 Unix 中的 qed 編輯器。

如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現在正則表達式都是基於文本的編輯器和搜索工具中的一個重要部分
3. 正則表達式定義
正則表達式(regular expression)描述了一種字元串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。

列目錄時, dir *.txt或ls *.txt中的*.txt就不是一個正則表達式,因為這里*與正則式的*的含義是不同的。
正則表達式是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。正則表達式作為一個模板,將某個字元模式與所搜索的字元串進行匹配。

3.1 普通字元
由所有那些未顯式指定為元字元的列印和非列印字元組成。這包括所有的大寫和小寫字母字元,所有數字,所有標點符號以及一些符號。

3.2 非列印字元 字元 含義
\cx 匹配由x指明的控制字元。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字元。
\f 匹配一個換頁符。等價於 \x0c 和 \cL。
\n 匹配一個換行符。等價於 \x0a 和 \cJ。
\r 匹配一個回車符。等價於 \x0d 和 \cM。
\s 匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S 匹配任何非空白字元。等價於 [^ \f\n\r\t\v]。
\t 匹配一個製表符。等價於 \x09 和 \cI。
\v 匹配一個垂直製表符。等價於 \x0b 和 \cK。

3.3 特殊字元

所謂特殊字元,就是一些有特殊含義的字元,如上面說的"*.txt"中的*,簡單的說就是表示任何字元串的意思。如果要查找文件名中有*的文件,則需要對*進行轉義,即在其前加一個\。ls \*.txt。正則表達式有以下特殊字元。

特別字元 說明
$ 匹配輸入字元串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字元本身,請使用 \$。
( ) 標記一個子表達式的開始和結束位置。子表達式可以獲取供以後使用。要匹配這些字元,請使用 \( 和 \)。
* 匹配前面的子表達式零次或多次。要匹配 * 字元,請使用 \*。
+ 匹配前面的子表達式一次或多次。要匹配 + 字元,請使用 \+。
. 匹配除換行符 \n之外的任何單字元。要匹配 .,請使用 \。
[ 標記一個中括弧表達式的開始。要匹配 [,請使用 \[。
? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字元,請使用 \?。
\ 將下一個字元標記為或特殊字元、或原義字元、或向後引用、或八進制轉義符。例如, 'n' 匹配字元 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
^ 匹配輸入字元串的開始位置,除非在方括弧表達式中使用,此時它表示不接受該字元集合。要匹配 ^ 字元本身,請使用 \^。
{ 標記限定符表達式的開始。要匹配 {,請使用 \{。
| 指明兩項之間的一個選擇。要匹配 |,請使用 \|。

構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字元與操作符將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字元、字元集合、字元范圍、字元間的選擇或者所有這些組件的任意組合。

3.4 限定符

限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。有*或+或?或{n}或{n,}或{n,m}共6種。
*、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上一個?就可以實現非貪婪或最小匹配。
正則表達式的限定符有:

字元 描述
* 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+ 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
? 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

3.5 定位符

用來描述字元串或單詞的邊界,^和$分別指字元串的開始與結束,\b描述單詞的前或後邊界,\B表示非單詞邊界。不能對定位符使用限定符。

3.6 選擇

用圓括弧將所有選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括弧會有一個副作用,是相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種副作用。
其中?:是非捕獲元之一,還有兩個非捕獲元是?=和?!,這兩個還有更多的含義,前者為正向預查,在任何開始匹配圓括弧內的正則表達式模式的位置來匹配搜索字元串,後者為負向預查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字元串。

3.7 後向引用

對一個正則表達式模式或部分模式兩邊添加圓括弧將導致相關匹配存儲到一個臨時緩沖區中,所捕獲的每個子匹配都按照在正則表達式模式中從左至右所遇到的內容存儲。存儲子匹配的緩沖區編號從 1 開始,連續編號直至最大 99 個子表達式。每個緩沖區都可以使用 '\n' 訪問,其中 n 為一個標識特定緩沖區的一位或兩位十進制數。
可以使用非捕獲元字元 '?:', '?=', or '?!' 來忽略對相關匹配的保存。

編譯原理中, regular expression (正則表達式)和regular language(正則語言)有什麼區別

正則表達式是對正則語言的一個描述。正則語言是一個集合,這個集合里的元素都滿足正則表達式描述的規則。

③ 看完就懂系列之正則表達式(值得收藏)

正則表達式是很多程序員,甚至是一些有了多年經驗的開發者薄弱的一項技能。大家都很多時候都會覺得正則表達式難記、難學、難用,但不可否認的是正則表達式是一項很重要的技能,所有我將學習和使用正則表達式時的關鍵點整理如下,供大家參考。

正則表達式(Regular Expression 或 Regex),是用於定義某種特定搜索模式的字元組合。正則表達式可用於匹配、查找和替換文本中的字元,進行輸入數據的驗證,查找英文單詞的拼寫錯誤等。

調試工具

下面列出了幾款優秀的在線調試工具,如果你想創建或者調試正則表達式可能會需要。個人比較偏好Regex101,regex101 支持在正則表達式的不同 flavor 之間切換、解釋你的正則表達式、顯示匹配信息、提供常用語法參考等功能,非常強大。

Regex101

Regexr

Regexpal

在 Javascript 中,一個正則表達式以 / 開頭和結尾,所以簡單至 /hello regexp/ 就是一個正則表達式。

Flags(標志符或修飾符)

Flags 寫在結束的/之後,可以影響整個正則表達式的匹配行為。常見的 flags 有:

Flags 可以組合使用,如:

Character Sets(字元集合)

用於匹配字元集合中的任意一個字元,常見的字元集有:

比如匹配所有的字母和數字可以寫成:/[a-zA-Z0-9]/ 或者 /[a-z0-9]/i。

Quantifiers (量詞)

在實際使用中,我們常常需要匹配同一類型的字元多次,比如匹配 11 位的手機號,我們不可能將 [0-9] 寫 11 遍,此時我們可以使用 Quantifiers 來實現重復匹配。

Metacharacters(元字元)

在正則表達式中有一些具有特殊含義的字母,被稱為元字元,簡言之,元字元就是描述字元的字元,它用於對字元表達式的內容、轉換及各種操作信息進行描述。

常見的元字元有:

Special Characters (特殊字元)

正則中存在一些特殊字元,它們不會按照字面意思進行匹配,而有特殊的意義,比如前文講過用於量詞的?、*、+。其他常見的特殊字元有:

Groups(分組)

Assertion(斷言)

最後,推薦大家使用Fundebug,一款很好用的 BUG 監控工具~

上面羅列出了這么多正則表達式的語法和規則,可以在一定程度上幫助我們分析和理解一段正則表達式的作用,但是如何將這些規則組合並創造出有特定作用的表達式還需要我們自己多加練習,下面舉幾個例子來說明運用這些規則。

1. 匹配手機號碼

我們先從比較簡單的匹配手機號碼開始。目前國內的手機號碼是1(3/4/5/7/8)開頭的 11 位數字,因此手機號碼的正則可以分解為以下幾部分:

組合起來即為 /^1[34578]d{9}$/ 或 /^1(3|4|5|7|8)d{9}$/,因為使用捕獲括弧存在性能損失,所以推薦使用第一種寫法。

2. 匹配電子郵件

標準的電子郵件組成為 <yourname>@<domain>.<extension><optional-extension>,

每部分的格式標准為(進行了相應的簡化,主要為展示如何書寫正則):

每部分的正則表達式為:

組合起來形成最後的正則表達式:/^([a-zd._-]+)@([a-zd-]+).([a-z]{2,8})(.[a-z]{2,8})?$/;為了增加可讀性可以將每部分用"()"包起來,並不要忘記起始和結束符 ^$。

④ 正則式含義

概念
編輯
正則表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個「規則字元串」,這個「規則字元串」用來表達對字元串的一種過濾邏輯。

簡介
編輯
正則表達式是對字元串(包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為「元字元」))操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個「規則字元串」,這個「規則字元串」用來表達對字元串的一種過濾邏輯。正則表達式是一種文本模式,模式描述在搜索文本時要匹配的一個或多個字元串。
目的
編輯
給定一個正則表達式和另一個字元串,我們可以達到如下的目的:
1. 給定的字元串是否符合正則表達式的過濾邏輯(稱作「匹配」):
2. 可以通過正則表達式,從字元串中獲取我們想要的特定部分。

特點
編輯
正則表達式的特點是:
1. 靈活性、邏輯性和功能性非常強;
2. 可以迅速地用極簡單的方式達到字元串的復雜控制。
3. 對於剛接觸的人來說,比較晦澀難懂。
由於正則表達式主要應用對象是文本,因此它在各種文本編輯器場合都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達式來處理文本內容
來自網路

⑤ 正則表達式是什麼

正則表達式(英文:Regular Expression),在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字元串的單個字元串。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索和/或替換那些符合某個模式的文本內容。許多程序設計語言都支持利用正則表達式進行字元串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。「正則表達式」通常縮寫成「regex」,單數有regexp、regex,復數有regexps、regexes、regexen。
基本概念 一個正則表達式通常被稱為一個模式 (pattern),為用來描述或者匹配一系列符合某個句法規則的字元串。例如:Handel、H�0�1ndel 和 Haendel 這三個字元串,都可以由 "H(a|�0�1|ae)ndel" 這個模式來描述。大部分正則表達式的形式都有如下的結構:替換 | 豎直分隔符代表替換。例如"gray|grey"可以匹配grey或gray。</dd>數量限定 某個字元後的數量限定符用來限定前面這個字元允許出現的個數。最常見的數量限定符包括「+」,「?」和「*」(不加數量限定則代表出現一次且僅出現一次):+ 加號代表前面的字元必須至少出現一次。(1次,或多次)。例如,"goo+gle"可以匹配google,gooogle,goooogle等;</dd>? 問號代表前面的字元最多隻可以出現一次。(0次,或1次)。例如,"colou?r"可以匹配colour或者color;</dd>* 星號代表前面的字元可以不出現,也可以出現一次或者多次。(0次,或1次,或多次)。例如,"0*42"可以匹配42,042,0042,00042等。</dd>匹配 圓括弧可以用來定義操作符的范圍和優先度。例如,"gr(a|e)y"等價於"gray|grey","(grand)?father"匹配father和grandfather。上述這些構造子都可以自由組合,因此,"H(ae?|�0�1)ndel"和"H(a|ae|�0�1)ndel"是相同的。精確的語法可能因不同的工具或程序而異。歷史 最初的正則表達式出現於理論計算機科學的自動控制理論和形式語言理論中。在這些領域中有對計算(自動控制)的模型和對形式語言描述與分類的研究。1940年代,Warren McCulloch與Walter Pitts將神經系統中的神經元描述成小而簡單的自動控制元。在1950年代,數學家斯蒂芬·科爾·克萊尼利用稱之為正則集合的數學符號來描述此模型。肯·湯普遜將此符號系統引入編輯器QED,然後是Unix上的編輯器ed,並最終引入grep。自此,正則表達式被廣泛地使用於各種Unix或者類似Unix的工具,例如Perl。Perl正則表達式源自於Henry Spencer寫的regex,它已經演化成了pcre(Perl兼容正則表達式Perl Compatible Regular Expressions),一個由Philip Hazel開發的,為很多現代工具所使用的庫。各計算機語言之間的正則表達式的整合目前開展的很差。未來的Perl6的子項目Apocalypse的設計中已考慮到了這點。形式語言理論 正則表達式可以用形式語言理論的方式來表達。正則表達式由常量和運算元組成,它們分別指示字元串的集合和在這些集合上的運算。給定有限字母表 Σ 定義了下列常量:(「空集」) �6�1 指示集合 �6�1 (「空串」) ε 指示集合 {ε} (「文字字元」) 在 Σ 中的 a 指示集合 {a} 定義了下列運算:(「串接」) RS 指示集合 { αβ | α ∈ R ∧ β ∈ S }。例如 {"ab"|"c"}{"d"|"ef"} = {"abd", "abef", "cd", "cef"}。 (「選擇」) R|S 指示 R 和 S 的並集。 (「Kleene星號」) R* 指示包含 ε 並且閉合在字元串串接下的 R 的最小超集。這是可以通過 R 中的零或多個字元串的串接得到所有字元串的集合。例如,{"ab", "c"}* = {ε, "ab", "c", "abab", "abc", "cab", "cc", "ababab", ... }。 上述常量和運算元形成了克萊尼代數。很多課本使用對選擇使用符號 ∪, + 或 ∨ 替代豎杠。為了避免括弧,假定 Kleene 星號有最高優先順序,接著是串接,接著是並集。如果沒有歧義則可以省略括弧。例如,(ab)c 可以寫為 abc 而 a|(b(c*)) 可以寫為 a|bc*。例子:a|b* 指示 {ε, a, b, bb, bbb, ...}。 (a|b)* 指示由包括空串、任意數目個 a 和 b 字元組成的所有字元串的集合。 ab*(c|ε) 指示開始於一個 a 接著零或多個 b 和最終可選的一個 c 的字元串的集合。 正則表達式的形式定義故意非常精簡,避免定義多餘的量詞 ? 和 +,它們可以被表達為: a+ = aa* 和 a? = (a|ε)。有時增加補運算元 ~ ;~R 指示在 Σ* 上的不在 R 中的所有字元串的集合。補運算元是多餘的,因為它使用其他運算元來表達(盡管計算這種表示的過程是復雜的,而結果可能指數性的增大)。這種意義上的正則表達式可以表達正則語言,精確的是可被有限狀態自動機接受的語言類。但是在簡潔性上有重要區別。某類正則語言只能用大小指數增長的自動機來描述,而要求的正則表達式的長度只線性的增長。正則表達式對應於喬姆斯基層級的類型-3文法。在另一方面,在正則表達式和不導致這種大小上的爆炸的非確定有限狀態自動機(NFA)之間有簡單的映射;為此 NFA 經常被用作正則表達式的替代表示。我們還要在這種形式化中研究表達力。如下面例子所展示的,不同的正則表達式可以表達同樣的語言: 這種形式化中存在著冗餘。有可能對兩個給定正則表達式寫一個演算法來判定它們所描述的語言是否本質上相等,簡約每個表達式到極小確定有限自動機,確定它們是否同構(等價)。這種冗餘可以消減到什麼程度? 我們可以找到仍有完全表達力的正則表達式的有趣的子集嗎? Kleene 星號和並集明顯是需要的,但是我們或許可以限制它們的使用。這提出了一個令人驚奇的困難問題。因為正則表達式如此簡單,沒有辦法在語法上把它重寫成某種規 范形式。過去公理化的缺乏導致了星號高度問題。最近 Dexter Kozen 用克萊尼代數公理化了正則表達式。很多現實世界的「正則表達式」引擎實現了不能用正則表達式代數表達的特徵。表達式全集 正則表達式有多種不同的風格。下表是在PCRE中元字元及其在正則表達式上下文中的行為的一個完整列表:字元描述\將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進制轉義符。例如,「n」匹配字元「n」。「\n」匹配一個換行符。序列「\\」匹配「\」而「\(」則匹配「(」。^匹配輸入字元串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配「\n」或「\r」之後的位置。$匹配輸入字元串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配「\n」或「\r」之前的位置。*匹配前面的子表達式零次或多次。例如,zo*能匹配「z」以及「zoo」。*等價於{0,}。+匹配前面的子表達式一次或多次。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價於{1,}。?匹配前面的子表達式零次或一次。例如,「do(es)?」可以匹配「do」或「does」中的「do」。?等價於{0,1}。{n}n是一個非負整數。匹配確定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,但是能匹配「food」中的兩個o。{n,}n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的所有o。「o{1,}」等價於「o+」。「o{0,}」則等價於「o*」。{n,m}m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,「o{1,3}」將匹配「fooooood」中的前三個o。「o{0,1}」等價於「o?」。請注意在逗號和兩個數之間不能有空格。?當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字元串,而默認的貪婪模式則盡可能多的匹配所搜索的字元串。例如,對於字元串「oooo」,「o+?」將匹配單個「o」,而「o+」將匹配所有「o」。.匹配除「\n」之外的任何單個字元。要匹配包括「\n」在內的任何字元,請使用像「[.\n]」的模式。(pattern)匹配pattern並獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括弧字元,請使用「\(」或「\)」。(?:pattern)匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。這在使用「或」字元(|)來組合一個模式的各個部分是很有用。例如,「instr(?:y|ies)就是一個比」instry|instries'更簡略的表達式。(?=pattern)正向預查,在任何匹配pattern的字元串開始處匹配查找字元串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如, 「Windows(?=95|98|NT|2000)」能匹配「Windows2000」中的「Windows」,但不能匹配「Windows3.1」中 的「Windows」。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字元之後開始。(?!pattern)負向預查,在任何不匹配pattern的字元串開始處匹配查找字元串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如 「Windows(?!95|98|NT|2000)」能匹配「Windows3.1」中的「Windows」,但不能匹配「Windows2000」中 的「Windows」。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字元之後開始x|y匹配x或y。例如,「z|food」能匹配「z」或「food」。「(z|f)ood」則匹配「zood」或「food」。[xyz]字元集合。匹配所包含的任意一個字元。例如,「[abc]」可以匹配「plain」中的「a」。[^xyz]負值字元集合。匹配未包含的任意字元。例如,「[^abc]」可以匹配「plain」中的「p」。[a-z]字元范圍。匹配指定范圍內的任意字元。例如,「[a-z]」可以匹配「a」到「z」范圍內的任意小寫字母字元。[^a-z]負值字元范圍。匹配任何不在指定范圍內的任意字元。例如,「[^a-z]」可以匹配任何不在「a」到「z」范圍內的任意字元。\b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,「er\b」可以匹配「never」中的「er」,但不能匹配「verb」中的「er」。\B匹配非單詞邊界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。\cx匹配由x指明的控制字元。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的「c」字元。\d匹配一個數字字元。等價於[0-9]。\D匹配一個非數字字元。等價於[^0-9]。\f匹配一個換頁符。等價於\x0c和\cL。\n匹配一個換行符。等價於\x0a和\cJ。\r匹配一個回車符。等價於\x0d和\cM。\s匹配任何空白字元,包括空格、製表符、換頁符等等。等價於[\f\n\r\t\v]。\S匹配任何非空白字元。等價於[^\f\n\r\t\v]。\t匹配一個製表符。等價於\x09和\cI。\v匹配一個垂直製表符。等價於\x0b和\cK。\w匹配包括下劃線的任何單詞字元。等價於「[A-Za-z0-9_]」。\W匹配任何非單詞字元。等價於「[^A-Za-z0-9_]」。\xn匹配n,其中n為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。例如,「\x41」匹配「A」。「\x041」則等價於「\x04」&「1」。正則表達式中可以使用ASCII編碼。.\num匹配num,其中num是一個正整數。對所獲取的匹配的引用。例如,「(.)\1」匹配兩個連續的相同字元。\n標識一個八進制轉義值或一個向後引用。如果\n之前至少n個獲取的子表達式,則n為向後引用。否則,如果n為八進制數字(0-7),則n為一個八進制轉義值。\nm標識一個八進制轉義值或一個向後引用。如果\nm之前至少有nm個獲得子表達式,則nm為向後引用。如果\nm之前至少有n個獲取,則n為一個後跟文字m的向後引用。如果前面的條件都不滿足,若n和m均為八進制數字(0-7),則\nm將匹配八進制轉義值nm。\nml如果n為八進制數字(0-3),且m和l均為八進制數字(0-7),則匹配八進制轉義值nml。\un匹配n,其中n是一個用四個十六進制數字表示的Unicode字元。例如,\u00A9匹配版權符號(�0�8)。範例 以下以PHP的語法所寫的範例驗證字串是否只含數字與英文, 字串長度並在4~16個字元之間 <?php
$str = 'a1234';
if (preg_match("^[a-zA-Z0-9]{4,16}$", $str)) {
echo "驗證成功";
} else {
echo "驗證失敗";
}
?> 簡易的台灣身份證字型大小驗證 <?php
$str = 'a1234';
if (preg_match("^[A-Z]{1}[1-2]{1}[0-9]{8}$", $str)) {
echo "驗證成功";
} else {
echo "驗證失敗";
}
?>

⑥ 編譯原理正則表達式化簡

你好,語言L={a}{a,b}∗({ϵ}∪({.,_}{a,b}{a,b}∗))L={a}{a,b}

({ϵ}∪({.,_}{a,b}{a,b}

))
這個語言是指,由a開頭,後接任意長度的a、b串,然後再接空串(代表結束)。或者是接以.或_開頭的,後接長度大於等於1的a、b串。

正則表達式(Regular Expression, RE)是一種用來描述正則語言的更緊湊的表示方法。

⑦ 正則表達式概述 什麼是正則表達式

正則表達式概述

正則表達式在程序設計語言中存在著廣泛的應用,特別是用來處理字元串。如匹配字元串、查找字元串、替換字元串等。可以說,正則表達式是一段文本或一個公式,它是用來描述用某種模式去匹配一類字元串的公式,並且該公式具有一定的模式。
本小節將介紹正則表達式的基本概念、第一個正則表達式,以及測試正則表達式的工具Code Architects Regex Tester。

什麼是正則表達式

正則表達式(Regular
Expression)起源於人類神經系統的早期研究。神經生理學家Warren McCulloch和Walter
Pitts研究出一種使用數學方式描述神經網路的方法。1956年,數學家Stephen
Kleene發表了一篇標題為「神經網事件的表示法」的論文,並在該論文中引入了「正則表達式」這一個概念。該論文稱正則表達式是:「正則集的代數」的表達式。因此,採用「正則表達式」這個術語。正則表達式的定義存在多種說法,具體如下:

正則表達式就是用某種模式去匹配一類字元串的公式,主要用來描述字元串匹配的工具。

正則表達式描述了一種字元串匹配的模式。它可以用來檢查字元串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。

正則表達式是由普通字元(如字元a到z)以及特殊字元(稱為元字元)組成的文字模式。正則表達式作為一個模板,將某個字元模式與所搜索的字元串進行匹配。

正則表達式就是用於描述某些規則的工具。這些規則經常用於處理字元串中的查找或替換字元串。換句話說,正則表達式就是記錄文本規則的代碼。

正則表達式就是用一個「字元串」來描述一個特徵,然後去驗證另一個「字元串」是否符合這個特徵。
學過《編譯原理》的讀者可能知道不確定有限自動機(Non-deterministic
finite automaton,簡稱NFA)和確定有限自動機(Deterministic finite
automaton,簡稱DFA)。其實,正則表達式是一個不確定有限自動機。NFA和DFA的最大區別在於它們的狀態轉換函數。NFA可以對同一個字元串產生多種理解方式,而DFA則只有唯一的一種理解方式。也正因為如此,NFA在匹配過程中可能會回溯,NFA的效率一般要低於DFA。因此,在書寫正則表達式時盡量減少回溯來提高正則表達式的效率。

如果你使用過Windows或DOS下用於文件查找的通配符*和?,那麼你不難理解正則表達式。如果你需要查找所有Word文檔,那麼可能使用表達式*.doc。其中,字元*是一個通配符,它可以代表任意字元串。正則表達式和通配符具有相似性,它也可以使用一些字元(如字元.)表示任意字元。然而,它比通配符更具有精確性。
在正則表達式中,匹配是最常用的一個詞語,它描述了正則表達式動作結果。給定一段文本或字元串,使用正則表達式從文本或字元串中查找出符合正則表達式的字元串。有可能文本或字元存在不止一個部分滿足給定的正則表達式,這時每一個這樣的部分被稱為一個匹配。其中,匹配存在下面3種類型:
形容詞性的匹配,即一個字元串匹配一個正則表達式。

動詞性的匹配,即在文本或字元串里匹配正則表達式。

名詞性的匹配,即字元串中滿足給定的正則表達式的一部分。

正則表達式的應用非常廣泛,特別是在字元串處理方面。目前來說,正則表達式已經在很多軟體中得到廣泛了應用,如Linux、Unix、HP等操作系統,C#、PHP、Java等程序開發環境,以及很多的應用軟體中,都可以看到正則表達式的這樣或那樣的應用。正則表達式常見的應用如下:

驗證字元串,即驗證給定的字元串或子字元串是否符合指定特徵,譬如驗證是否是合法的郵件地址、驗證是否為合法的HTTP地址等。

查找字元串,從給定的文本中查找符合指定特徵的字元串,比查找固定字元串更加靈活方便。
替換字元串,即把給定的字元串中的符合指定特徵的子字元串替換為其他字元串,比普通的替換更強大。
提取字元串,即從給定的字元串中提取符合指定特徵的子字元串。

⑧ java正則表達式是什麼

java正則表達式是計算機科學的一個概念。正則表達式使用單個字元串來描述、匹配一系列符合某個句法規則的字元串。

在編寫處理字元串的程序或網頁時,經常會有查找符合某些復雜規則的字元串的需要。正則表達式就是用於描述這些規則的工具。換句話說,正則表達式就是記錄文本規則的代碼。

很可能你使用過Windows/Dos下用於文件查找的通配符(wildcard),也就是*和?。如果你想查找某個目錄下的所有的Word文檔的話,你會搜索*.doc。在這里,*會被解釋成任意的字元串。

和通配符類似,正則表達式也是用來進行文本匹配的工具,只不過比起通配符,它能更精確地描述你的需求——當然,代價就是更復雜——比如你可以編寫一個正則表達式,用來查找所有以0開頭,後面跟著2-3個數字,然後是一個連字型大小「-」,最後是7或8位數字的字元串(像010-12345678或0376-7654321)。

正則表達式的基本操作:

正則表達式定義:符合一定規則的表達式。

作用:用於專門操作字元串。

特點:用於一些特定的符號來表示一些代碼操作。這樣就簡化書寫。所以學習正則表達式,就是在學習一些特殊符號的使用。

好處:可以簡化對字元串的復雜操作。

弊端:符號定義越多,正則越長,閱讀性越差。

閱讀全文

與編譯原理中正則表達式的定義相關的資料

熱點內容
隱私與應用加密的圖案密碼 瀏覽:34
陳情令王一博解壓 瀏覽:35
c編譯器使用說明 瀏覽:703
鄭州前端程序員私活有風險嗎 瀏覽:10
小型螺桿機壓縮機 瀏覽:516
成人解壓最好的方法 瀏覽:48
最小製冷壓縮機 瀏覽:488
xampp支持python 瀏覽:367
深圳周立功單片機 瀏覽:58
圓上點與點之間角度演算法 瀏覽:869
怎麼知道微信關聯了哪些app 瀏覽:700
android事件驅動 瀏覽:886
簽約大屏系統源碼 瀏覽:806
安卓系統怎麼轉入平板 瀏覽:429
安卓手機相機怎麼提取文字 瀏覽:219
如何查看伺服器映射的外網地址 瀏覽:985
圖片刺綉演算法 瀏覽:675
阿里雲伺服器沒有實例 瀏覽:605
綿陽有沒有什麼app 瀏覽:849
怎麼用游俠映射伺服器 瀏覽:921