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