全面分析Linux正規表示式(二)

2021-05-25 07:15:58 字數 1914 閱讀 2770

linux正規表示式不僅僅是用於各種語言的程式設計,系統管理員也必須得熟悉。前面我介紹了模式修正符,現在我們繼續介紹,它是學好linux/unix必需掌握的乙個知識點,否則你連linux的啟動指令碼都讀不懂。

linux正規表示式的元字元(meta-characters)

linux正規表示式的威力在於其能夠在模式中包含選擇和迴圈。它們通過使用元字元來編碼在模式中,元字元不代表其自身,它們用一些特殊的方式來解析。

有兩組不同的元字元:一種是模式中除了方括號內都能被識別的,還有一種是在方括號內被識別的。如果想在模式裡包含乙個元字元本身,就需要用到轉義符號,正規表示式常用反斜線「/」作為轉義字元使用,為了匹配「/」本身,你需要輸入兩個「/」,向這樣「//」。當然,這個符號本身也是乙個元字元。

方括號之外的元字元有這些:

/有數種用途的通用轉義符

^斷言目標的開頭(或在多行模式下行的開頭,即緊隨一換行符之後)

$斷言目標的結尾(或在多行模式下行的結尾,即緊隨一換行符之前)

.匹配除了換行符外的任意乙個字元(預設情況下)

[字元類定義開始

]字元類定義結束

|開始乙個多選一的分支

(子模式開始

)子模式結束

?擴充套件 ( 的含義,我們已經在介紹模式修正符裡看到過它的使用。它也可以是 0 或 1 數量限定符,以及數量限定符最小值

*匹配 0 個或多個的數量限定符

+匹配 1 個或多個的數量限定符

最少/最多數量限定結束

模式中方括號內的部分稱為「字元類」。字元類中可用的元字元為:

/通用轉義字元

^排除字元類,但僅當其為第乙個字元時有效

-指出字元範圍

在這裡,最值得一提是「/」這個元字元。之所以重點對它進行講解是因為這乙個元字元有多種不同的用法,在不同情況下代表不同的含義,而且使用頻率非常高,是個很容易讓人迷惑的地方。

第一種用法前面我們已經提過,是作為通用轉義字元使用,如果其後跟著乙個非字母數字字元,則取消該字元可能具有的任何特殊含義。此種將反斜線用作轉義字元的用法適用於無論是字元類之中還是之外。例如「//」代表乙個單獨的反斜線「/」。

第二種用途提供了一種在模式中以可見方式去編碼不可列印字元的方法。模式中完全可以包括不可列印字元,除了代表模式結束的二進位制零,例如,可以用「/a」代表alarm,即 bel 字元(0x07),或用「/cx」代表"control-x",其中 x 是任意字元。當然,這種方法表示的不一定非得是不可列印字元,實際上,可以用「/xhh(十六進製制**為 hh 的字元)」和「/ddd(八進位制**為 ddd 的字元)」來以編碼的形式表達任何單位元組字元,例如「/040」可以用來表示空格。

反斜線的第三個用法是指定通用字元型別,這些字元型別序列可以出現在字元類之中和之外。每乙個匹配相應型別中的乙個字元。如果當前匹配點在目標字串的結尾,以上所有匹配都失敗,因為沒有字元可供匹配。有以下這些常見的通用字元類:

/d 任一十進位制數字

/d任一非十進位制數的字元

/s任一空白字元

/s任一非空白字元

/w任一「字」的字元

/w任一「非字」的字元

反斜線的第四個用法是某些簡單的斷言,關於斷言的討論我們放在後面,這裡先不加討論。

反斜線的最後乙個用法是逆向引用。關於逆向引用,我們會在後面討論逆向引用的部分來做進一步的討論。

我們已經看到,反斜線的眾多用法,其中一些涉及到了以後才講的內容。我們在模式中遇到反斜線時一定要注意它具體是哪一種用途以免疑惑。

另外兩個方括號也是非常重要的元字元,左方括號開始了乙個字元類,右方括號結束之。單獨乙個右方括號不是特殊字元。字元類匹配目標中的乙個字元,該字元必須是字元類定義的字符集中的乙個;除非字元類中的第乙個字元是音調符(^),此情況下目標字元必須不在字元類定義的字符集中。如果在字元類中需要音調符本身,則其必須不是第乙個字元,或用反斜線轉義。例如,[^a-z]表式非大寫字元。

這裡先介紹到這裡,linux正規表示式將繼續在後面介紹。

全面分析Linux正規表示式 三

linux正規表示式的模式修正符與元字元在前面兩篇我們已經介紹了,因為網上現有的正規表示式資料都對這部分都有詳細的介紹和眾多的例子,如果覺得對前一部分缺乏了解可以參看這些資料。本文希望可以盡可能多涉及一些較高階的正規表示式特性。在本文裡,我們主要介紹linux正規表示式的子模式 subpattern...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...

正規表示式分析

1.請分析這下面這兩個輸出吧,最好乙個乙個斜槓地分析。system.out.println 8abc8 replaceall 8 8abc system.out.println 8abc8 replaceall 8 8abc 2.為什麼a和b可以有相同的輸出,c和d卻不可以呢?system.out....