日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Emacs 正则表达式简介(From 水木清华)

發布時間:2024/3/26 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 有全面的回退功能,以處理“\|”的多種的用途。
“\( ... \)”
??分組結構,有三個功能:
??
  • 圍住“\|”的選擇項,以實現別的操作。例如“\(foo\|bar\)x”匹配
    ??“foox”或“barx”。
    ??
  • 圍住復雜的表達式以實現后綴操作符(如“*”“+”和“?”)的操作。例如
    ??“ba\(na\)*”匹配如“bananana”等,有任意個(零或更多)的“na”串。
    ??
  • 記錄一個已匹配的子串用作后面的參考引用。
    ??最后一個應用并不是括號的分組功能思想的結果;這個分開的特點是給同樣的
    ??“\( ... \)”結構賦予的第二種含義。在實際應用中,這兩種含義通常不會發生
    ??沖突。當發生沖突的時候,可以使用“謹慎的”分組("shy" group)。
    “\(?: ... \)”
    ??
    ??“謹慎的”分組("shy" group),這個分組不記錄匹配的子串;你不能用“\D”來
    ??引用。這在機械的結合正則表達式的時候有用,這樣,你可以為語法目的加入分
    ??組,而不用干涉使用者寫的分組的個數。
    “\D”
    ??匹配和“\( ... \)”結構第 D 次出現時所匹配的同樣的文本。
    ??在“\( ... \)”結構結束之后,匹配程序保存被這個結構匹配的文本(的開始和
    ??結束);之后的正則表達式中,你可以使用“\”跟著一個數字 D 來表示“匹配
    ??和‘\( ... \)’結構第 D 次出現時所匹配的同樣的文本。”
    ??正則表達式中前九個出現的“\( ... \)”結構,按正則表達式中左括號出現的次
    ??序從 1 到 9 賦值。因此可以用“\1”到“\9”來引用相應的“\( ... \)”結構。
    ??例如,“\(.*\)\1”匹配任何有完全相同的兩部分而無換行符的串。“\(.*\)”
    ??匹配前一半,可以是任意的串,“\1”匹配后面的,但必須和前面的完全相同。
    ??如果一個特定的“\( ... \)”結構匹配了多次(比如后面有一個“*”,這很顯
    ??然),那么僅記錄最后一次的匹配。
    “\`”
    ??匹配空串,但僅是接在緩沖區的開始處的。
    “\'”
    ??匹配空串,但僅是接在緩沖區的尾部的。
    “\=”
    ??匹配空串,但僅在“點(point)”處的。
    “\b”
    ??
    ??匹配空串,但僅在一個詞的開始或者結尾的。例如,“\bfoo\b”匹配任何作為單
    ??獨的詞出現的“foo”。“\bballs?\b”匹配作為單獨的詞出現的“ball”或
    ??“balls”。
    ??在緩沖區的開始和結束位置時,“\b”不考慮緊接其前的文本是什么。
    “\B”
    ??匹配空串,但不在詞的開始或結尾處。
    “\
    ??
    ??匹配空串,但僅在詞的開始處。僅當一個構成詞的字符在緩沖區開始處時“\
    “\>”
    ??
    ??匹配空串,但僅在詞的結尾處。僅當緩沖區尾部有構成詞的字符時“\>”匹配緩
    ??沖區尾部的空串。
    “\w”
    ??匹配任何構成詞的字符。由語法表決定這些字符是什么。
    “\W”
    ??匹配任何非構成詞的字符。
    “\sC”
    ??
    ??匹配任何語法是 C 的字符。這里 C 是一個指定特定語法類的字符:如“w”為詞
    ??的構成字符,“-”或“ ”為空白,“.”為普通標點符號,等等。
    “\SC”
    ??匹配任何字符不屬于語法 C。
    “\cC”
    ??
    ??匹配任何屬于種類 C 的字符。例如,“\cc”匹配漢字,“\cg”匹配希臘字符等。
    ??如果想了解已知種類,用“M-x describe-categories ”。
    “\CC”
    ??匹配所有不屬于種類C的字符。
    屬于詞和語法的結構是由語法表的設置來控制的。

    ??下面是一個復雜的正則表達式,存儲在“sentence-end”,Emacs 將其用于識
    別句子的結束以及后面的任何空白。其中以 Lisp 語法區分了空白符和制表符。在
    Lisp 語法中,串常量用雙引號括起來。“\"”表示雙引號是表達式的一部分,
    “\\”表示反斜扛是表達式的一部分,“\t”表示制表符,“\n”表示換行。
    ? ?"[.?!][]\"')]*\\($\\| $\\|\t\\|??\\)[ \t\n]*"
    其中包含四個連續的部分:匹配句號(“.”)、“?”或“!”的字符集;匹配右方括
    號、右(單/雙)引號的字符集的任意次重復的部分;在“反斜線括號”部分中,匹配
    行尾、行尾空白、制表符或兩個空格的可選集合;以及一個任意次匹配空白的字符
    集。
    ??在增量搜索中,要用??輸入制表符,“C-j”輸入換行符。也可以使用單
    獨的反斜線,不用象 Lisp 串中那樣寫成兩個。

總結

以上是生活随笔為你收集整理的Emacs 正则表达式简介(From 水木清华)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。