Emacs 正则表达式简介(From 水木清华)
生活随笔
收集整理的這篇文章主要介紹了
Emacs 正则表达式简介(From 水木清华)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Emacs 正則表達(dá)式簡介(From 水木清華)
? ?
發(fā)信人: dddkk (進(jìn)化的魚), 信區(qū): Emacs
標(biāo)??題: Emacs 的正則表達(dá)式
發(fā)信站: BBS 水木清華站 (Thu Mar 18 20:11:52 2004), 轉(zhuǎn)信
兩年多以前翻譯的,就是 (info "(emacs)Regexps") 一節(jié)。
正則表達(dá)式語法
??正則表達(dá)式(regular expressions, 縮寫為regexp)是由幾個(gè)特殊字符和一些普通
字符組成,一個(gè)普通就是一個(gè)簡單的正則表達(dá)式,僅僅可以匹配與自己相同的字符。
而特殊字符包括“$”,“^”, “.”, “*”, “+”, “?”,“[”, “]”
以及 “\”。除非在一個(gè)字符前面有“\”,否則正則表達(dá)式中的出現(xiàn)的任何其他字符
都是普通字符,(當(dāng)你在 Lisp 語言的程序中使用正則表達(dá)式的時(shí)候,每一個(gè)“\”都
必須寫成兩個(gè),請(qǐng)看下面的例子。)
??例如,“f”不是特殊字符,是普通字符,因此“f”是一個(gè)正則表達(dá)式,它僅僅
匹配“f”這個(gè)字符串。(不匹配串“ff”。)同樣“o”是一個(gè)僅僅匹配串“o”的正
則表達(dá)式。(當(dāng)不區(qū)分大小寫的時(shí)候,上面提到的式子也匹配“F”和“O”,而一般
認(rèn)為它們是“同樣的串”,并不是例外。)
??兩個(gè)任意的表達(dá)式 A 和 B 可以被連接。結(jié)果是一個(gè)能夠匹配以 A 開始,其余部
分是 B 的字符串的表達(dá)式。
??舉個(gè)簡單的例子,我們將表達(dá)式“f”和“o”連接,得到表達(dá)式“fo”,它僅匹
配串“fo”,很簡單的。想做些不簡單的,你需要使用特殊字符。下面為這些特殊字
符。
特殊字符
“. (Period)”
??
??一個(gè)匹配除了換行符(newline)之外任何單個(gè)字符的特殊字符。使用連接,我們
??可以得到如“a.b”的表達(dá)式,它匹配了所有的以“a”開始,以“b”結(jié)束的三
??個(gè)字符的字符串。
“*”
??
??自身不構(gòu)成表達(dá)式的部分;它是個(gè)后綴操作符,表示某個(gè)前導(dǎo)表達(dá)式重復(fù)任意次。
??比如,“o*”匹配任意個(gè)數(shù)的“o”(包括沒有“o”)。
??“*”總是作用于“最少的”可能的前導(dǎo)表達(dá)式。于是,“fo*”中,認(rèn)為“o”是
??的重復(fù),而不是“fo”,匹配形如“f”, “fo”, “foo”的串等等。
??匹配程序以迅速的、盡可能多的找到重復(fù)部分來處理一個(gè)帶“*”的結(jié)構(gòu)。然后繼
??續(xù)其他部分的處理。如果失敗了,為了使剩余的部分能夠盡可能的匹配,匹配程
??序會(huì)回退,放棄一些由“*”匹配的結(jié)構(gòu)。例如,在使用“ca*ar”來匹配串
??“caaar”時(shí),“a*”首先試圖匹配全部的三個(gè)“a”;但余下的部分是“ar”并
??且僅有“r”沒被匹配,因此這次試圖匹配失敗。接著選擇是用“a*”來匹配兩個(gè)
??“a”,并且匹配成功。
“+”
??
??是一個(gè)和“*”相似的后綴操作符,它匹配前導(dǎo)表達(dá)式至少一次的出現(xiàn)。例如,
??“ca+r”匹配串“car”和“caaaar”,不匹配“cr”,然而“ca*r”可以匹配這
??三個(gè)串。
“?”
??
??也是一個(gè)和“*”相似的操作符,它匹配前導(dǎo)表達(dá)式至多一次的出現(xiàn)。例如,
??“ca?r”僅僅匹配“car”或“cr”。
“*?, +?, ??”
??
??是前面幾個(gè)個(gè)操作符的非貪心(non-greedy)的變體。正常的“*”, “+”, “?”
??操作符是“貪心的(greedy)”,只要總體上能夠匹配,這些操作符總是盡可能多
??的匹配。當(dāng)有一個(gè)緊跟著的“?”,就是是非貪心的了:將盡可能少的匹配。
??“ab*”和“ab*?”都能匹配串“a”和“abbbb”;但如果你試圖用它們來匹配
??“abbb”時(shí),“ab*”將匹配全部(最長有效匹配),而“ab*?”將僅僅匹配“a”
??(最短有效匹配)。
“\{N\}”
??
??指定重復(fù)次數(shù)為 N 的后綴操作符,一個(gè)前導(dǎo)表達(dá)式必須恰好匹配了 N 次。例如
??“x\{4\}”僅僅匹配串“xxxx”。
“\{N,M\}”
??
??指定重復(fù)次數(shù)在N和M之間的后綴操作符,就是說它的前導(dǎo)表達(dá)式的匹配次數(shù)至少
??N 次但不能超過 M 次。如果省略 M,表示沒有上限,但它的前導(dǎo)表達(dá)式至少匹配
??N 次。“\{0,1\}”等同于“?”。“\{0,\}”等同于“*”。“\{1,\}”等同于
??“+”。
“[ ... ]”
??
??字符集,以“[”開始以“]”結(jié)束。最簡單的例子,在兩個(gè)方括號(hào)中間的字符就
??是這個(gè)集合所能匹配的全部。
??所以,“[ad]”僅匹配一個(gè)“a”或一個(gè)“d”,“[ad]*”匹配所有僅由“a”和
??“d”構(gòu)成的串(包括空串)。“c[ad]*r”匹配“cr”,“car”, “cdr”,
??“caddaar”,等等。
??也可以用一個(gè)“-”放在一個(gè)開始字符和一個(gè)結(jié)束字符的中間來在字符集中包含這
??個(gè)范圍。“[a-z]”匹配所有小寫 ASCII 字母。范圍可以和單獨(dú)的字符自由的組
??合在一起,比如“[a-z$%.]”,匹配了任意的小寫字母,或“$”,“%”,以及
??“.”。
??注意,通常在字符集中的特殊字符不再特殊。而在字符集中的“]”,“-”和
??“^”卻不這樣。
??如果想在集中包括“]”,必須把它作為字符集中的第一個(gè)字符。例如,“[]a]”
??匹配“]”或“a”。想包括“-”,它要是字符集中的第一個(gè)或最后一個(gè)字符。
??或者放在一個(gè)范圍的后面。如“[]-]”匹配“]”和“-”。
??如果想在集包括字符“^”,它可以在除第一個(gè)位置以外的任何地方。(在開始
??位置,它會(huì)把這個(gè)字符集取補(bǔ)——看下面。)
??當(dāng)不區(qū)分大小寫使用范圍時(shí),表示范圍的兩個(gè)字符或者都是大寫、或者都是小寫、
??或者都不是字母。混合大小寫的范圍如“A-z”有點(diǎn)錯(cuò)誤定義的意思,在將來的
??Emacs 中這個(gè)可能會(huì)被改變。
“[^ ... ]”
??
??“[^”表示“補(bǔ)集合”,匹配的字符是除掉指定的字符外其他所有的字符。如,
??“[^a-z0-9A-Z]”匹配除掉ASCII字母和數(shù)字的所有字符。
??當(dāng)“^”在字符集中第一個(gè)時(shí),被看作是特殊字符。而跟在“^”后面的字符被看
??作是第一個(gè)字符(就是說,此處的“-”和“]”將不是特殊的)。
??一個(gè)補(bǔ)集合可以匹配換行符,除非換行符被指定為補(bǔ)集合中的一個(gè)字符。這不同
??于某些象“grep”的程序?qū)φ齽t表達(dá)式的處理。
“^”
??
??僅僅匹配在文本中行首的那個(gè)空串的特殊字符。就是說,“^foo”匹配在行首的
??“foo”。
“$”
??
??和“^”相似,但僅匹配行尾的空串。因此“x+$”匹配在行尾的一個(gè)或多個(gè)“x”
??的串。
“\”
??有兩個(gè)作用:引用特殊字符(包括“\”);產(chǎn)生附加的特殊結(jié)構(gòu)。
??因?yàn)椤癨”引用特殊字符,“\$”是一個(gè)僅匹配“$”的表達(dá)式,“\[”是一個(gè)僅
??匹配“[”的表達(dá)式,等等。
關(guān)于反斜線
??注意:為兼容性考慮,特殊字符,如果在其沒有意義的上下文中,將被當(dāng)作普通
字符。比如:“*foo”中把“*”當(dāng)作普通字符,因?yàn)樵谒懊鏇]有可以作用的前導(dǎo)表
達(dá)式。很少有人會(huì)根據(jù)這條規(guī)則去實(shí)踐;無論如何,在任何地方都加上引用會(huì)更好些。
??對(duì)于大多數(shù)情況,“\”后接任何字符僅僅匹配那個(gè)字符。然而,有幾個(gè)例外:
以“\”開始的兩字符序列會(huì)有特殊的意思。其中的第二個(gè)字符往往是普通字符。下
面是“\”的結(jié)構(gòu)表。
“\|”
??
??指定一個(gè)選擇。中間有一個(gè)“\|”的兩個(gè)正則表達(dá)式 A 和 B,形成了一個(gè)可以匹
??配 A 或 B 的文本。它首先試圖用 A 匹配,如果失敗再用 B 去試。
??由此,“foo\|bar”僅匹配“foo”或“bar”。
??“\|”作用于兩邊最長的可能的表達(dá)式。僅由“\( ... \)”括起來才可以限制
??“\|”的分組能力。
??Emacs 有全面的回退功能,以處理“\|”的多種的用途。
“\( ... \)”
??分組結(jié)構(gòu),有三個(gè)功能:
??
? ?
發(fā)信人: dddkk (進(jìn)化的魚), 信區(qū): Emacs
標(biāo)??題: Emacs 的正則表達(dá)式
發(fā)信站: BBS 水木清華站 (Thu Mar 18 20:11:52 2004), 轉(zhuǎn)信
兩年多以前翻譯的,就是 (info "(emacs)Regexps") 一節(jié)。
正則表達(dá)式語法
??正則表達(dá)式(regular expressions, 縮寫為regexp)是由幾個(gè)特殊字符和一些普通
字符組成,一個(gè)普通就是一個(gè)簡單的正則表達(dá)式,僅僅可以匹配與自己相同的字符。
而特殊字符包括“$”,“^”, “.”, “*”, “+”, “?”,“[”, “]”
以及 “\”。除非在一個(gè)字符前面有“\”,否則正則表達(dá)式中的出現(xiàn)的任何其他字符
都是普通字符,(當(dāng)你在 Lisp 語言的程序中使用正則表達(dá)式的時(shí)候,每一個(gè)“\”都
必須寫成兩個(gè),請(qǐng)看下面的例子。)
??例如,“f”不是特殊字符,是普通字符,因此“f”是一個(gè)正則表達(dá)式,它僅僅
匹配“f”這個(gè)字符串。(不匹配串“ff”。)同樣“o”是一個(gè)僅僅匹配串“o”的正
則表達(dá)式。(當(dāng)不區(qū)分大小寫的時(shí)候,上面提到的式子也匹配“F”和“O”,而一般
認(rèn)為它們是“同樣的串”,并不是例外。)
??兩個(gè)任意的表達(dá)式 A 和 B 可以被連接。結(jié)果是一個(gè)能夠匹配以 A 開始,其余部
分是 B 的字符串的表達(dá)式。
??舉個(gè)簡單的例子,我們將表達(dá)式“f”和“o”連接,得到表達(dá)式“fo”,它僅匹
配串“fo”,很簡單的。想做些不簡單的,你需要使用特殊字符。下面為這些特殊字
符。
特殊字符
“. (Period)”
??
??一個(gè)匹配除了換行符(newline)之外任何單個(gè)字符的特殊字符。使用連接,我們
??可以得到如“a.b”的表達(dá)式,它匹配了所有的以“a”開始,以“b”結(jié)束的三
??個(gè)字符的字符串。
“*”
??
??自身不構(gòu)成表達(dá)式的部分;它是個(gè)后綴操作符,表示某個(gè)前導(dǎo)表達(dá)式重復(fù)任意次。
??比如,“o*”匹配任意個(gè)數(shù)的“o”(包括沒有“o”)。
??“*”總是作用于“最少的”可能的前導(dǎo)表達(dá)式。于是,“fo*”中,認(rèn)為“o”是
??的重復(fù),而不是“fo”,匹配形如“f”, “fo”, “foo”的串等等。
??匹配程序以迅速的、盡可能多的找到重復(fù)部分來處理一個(gè)帶“*”的結(jié)構(gòu)。然后繼
??續(xù)其他部分的處理。如果失敗了,為了使剩余的部分能夠盡可能的匹配,匹配程
??序會(huì)回退,放棄一些由“*”匹配的結(jié)構(gòu)。例如,在使用“ca*ar”來匹配串
??“caaar”時(shí),“a*”首先試圖匹配全部的三個(gè)“a”;但余下的部分是“ar”并
??且僅有“r”沒被匹配,因此這次試圖匹配失敗。接著選擇是用“a*”來匹配兩個(gè)
??“a”,并且匹配成功。
“+”
??
??是一個(gè)和“*”相似的后綴操作符,它匹配前導(dǎo)表達(dá)式至少一次的出現(xiàn)。例如,
??“ca+r”匹配串“car”和“caaaar”,不匹配“cr”,然而“ca*r”可以匹配這
??三個(gè)串。
“?”
??
??也是一個(gè)和“*”相似的操作符,它匹配前導(dǎo)表達(dá)式至多一次的出現(xiàn)。例如,
??“ca?r”僅僅匹配“car”或“cr”。
“*?, +?, ??”
??
??是前面幾個(gè)個(gè)操作符的非貪心(non-greedy)的變體。正常的“*”, “+”, “?”
??操作符是“貪心的(greedy)”,只要總體上能夠匹配,這些操作符總是盡可能多
??的匹配。當(dāng)有一個(gè)緊跟著的“?”,就是是非貪心的了:將盡可能少的匹配。
??“ab*”和“ab*?”都能匹配串“a”和“abbbb”;但如果你試圖用它們來匹配
??“abbb”時(shí),“ab*”將匹配全部(最長有效匹配),而“ab*?”將僅僅匹配“a”
??(最短有效匹配)。
“\{N\}”
??
??指定重復(fù)次數(shù)為 N 的后綴操作符,一個(gè)前導(dǎo)表達(dá)式必須恰好匹配了 N 次。例如
??“x\{4\}”僅僅匹配串“xxxx”。
“\{N,M\}”
??
??指定重復(fù)次數(shù)在N和M之間的后綴操作符,就是說它的前導(dǎo)表達(dá)式的匹配次數(shù)至少
??N 次但不能超過 M 次。如果省略 M,表示沒有上限,但它的前導(dǎo)表達(dá)式至少匹配
??N 次。“\{0,1\}”等同于“?”。“\{0,\}”等同于“*”。“\{1,\}”等同于
??“+”。
“[ ... ]”
??
??字符集,以“[”開始以“]”結(jié)束。最簡單的例子,在兩個(gè)方括號(hào)中間的字符就
??是這個(gè)集合所能匹配的全部。
??所以,“[ad]”僅匹配一個(gè)“a”或一個(gè)“d”,“[ad]*”匹配所有僅由“a”和
??“d”構(gòu)成的串(包括空串)。“c[ad]*r”匹配“cr”,“car”, “cdr”,
??“caddaar”,等等。
??也可以用一個(gè)“-”放在一個(gè)開始字符和一個(gè)結(jié)束字符的中間來在字符集中包含這
??個(gè)范圍。“[a-z]”匹配所有小寫 ASCII 字母。范圍可以和單獨(dú)的字符自由的組
??合在一起,比如“[a-z$%.]”,匹配了任意的小寫字母,或“$”,“%”,以及
??“.”。
??注意,通常在字符集中的特殊字符不再特殊。而在字符集中的“]”,“-”和
??“^”卻不這樣。
??如果想在集中包括“]”,必須把它作為字符集中的第一個(gè)字符。例如,“[]a]”
??匹配“]”或“a”。想包括“-”,它要是字符集中的第一個(gè)或最后一個(gè)字符。
??或者放在一個(gè)范圍的后面。如“[]-]”匹配“]”和“-”。
??如果想在集包括字符“^”,它可以在除第一個(gè)位置以外的任何地方。(在開始
??位置,它會(huì)把這個(gè)字符集取補(bǔ)——看下面。)
??當(dāng)不區(qū)分大小寫使用范圍時(shí),表示范圍的兩個(gè)字符或者都是大寫、或者都是小寫、
??或者都不是字母。混合大小寫的范圍如“A-z”有點(diǎn)錯(cuò)誤定義的意思,在將來的
??Emacs 中這個(gè)可能會(huì)被改變。
“[^ ... ]”
??
??“[^”表示“補(bǔ)集合”,匹配的字符是除掉指定的字符外其他所有的字符。如,
??“[^a-z0-9A-Z]”匹配除掉ASCII字母和數(shù)字的所有字符。
??當(dāng)“^”在字符集中第一個(gè)時(shí),被看作是特殊字符。而跟在“^”后面的字符被看
??作是第一個(gè)字符(就是說,此處的“-”和“]”將不是特殊的)。
??一個(gè)補(bǔ)集合可以匹配換行符,除非換行符被指定為補(bǔ)集合中的一個(gè)字符。這不同
??于某些象“grep”的程序?qū)φ齽t表達(dá)式的處理。
“^”
??
??僅僅匹配在文本中行首的那個(gè)空串的特殊字符。就是說,“^foo”匹配在行首的
??“foo”。
“$”
??
??和“^”相似,但僅匹配行尾的空串。因此“x+$”匹配在行尾的一個(gè)或多個(gè)“x”
??的串。
“\”
??有兩個(gè)作用:引用特殊字符(包括“\”);產(chǎn)生附加的特殊結(jié)構(gòu)。
??因?yàn)椤癨”引用特殊字符,“\$”是一個(gè)僅匹配“$”的表達(dá)式,“\[”是一個(gè)僅
??匹配“[”的表達(dá)式,等等。
關(guān)于反斜線
??注意:為兼容性考慮,特殊字符,如果在其沒有意義的上下文中,將被當(dāng)作普通
字符。比如:“*foo”中把“*”當(dāng)作普通字符,因?yàn)樵谒懊鏇]有可以作用的前導(dǎo)表
達(dá)式。很少有人會(huì)根據(jù)這條規(guī)則去實(shí)踐;無論如何,在任何地方都加上引用會(huì)更好些。
??對(duì)于大多數(shù)情況,“\”后接任何字符僅僅匹配那個(gè)字符。然而,有幾個(gè)例外:
以“\”開始的兩字符序列會(huì)有特殊的意思。其中的第二個(gè)字符往往是普通字符。下
面是“\”的結(jié)構(gòu)表。
“\|”
??
??指定一個(gè)選擇。中間有一個(gè)“\|”的兩個(gè)正則表達(dá)式 A 和 B,形成了一個(gè)可以匹
??配 A 或 B 的文本。它首先試圖用 A 匹配,如果失敗再用 B 去試。
??由此,“foo\|bar”僅匹配“foo”或“bar”。
??“\|”作用于兩邊最長的可能的表達(dá)式。僅由“\( ... \)”括起來才可以限制
??“\|”的分組能力。
??Emacs 有全面的回退功能,以處理“\|”的多種的用途。
“\( ... \)”
??分組結(jié)構(gòu),有三個(gè)功能:
??
|
總結(jié)
以上是生活随笔為你收集整理的Emacs 正则表达式简介(From 水木清华)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水木清华BBS站务公告(二则)
- 下一篇: Approximation method