2016-03-22 84 views
-2

以下3個正則表達式的主要區別是什麼?這三個正則表達式之間的區別是什麼

1)/^[^0-9]+$/

2)/[^0-9]+/

3)m/[^0-9]+/

我真的想了解這一點,因爲在網上研究並沒有幫助我很多,我希望我可以在這裏找到一些幫助。

+2

https://metacpan.org/pod/YAPE::Regex::Explain – toolic

回答

3

他們都有[^ 0-9] +,這是一個或多個字符是人數01,...到9

  • 第一個/^[^0-9]+$/錨定在字符串的開始和結尾,因此它將匹配任何只包含非數字的字符串。
  • 第二個/[^0-9]+/未錨定,因此它匹配任何包含至少一個(或多個)非數字的字符串。
  • 第三個m/[^0-9]+/與第二個相同,但明確使用m// match operator

對於一個很好的解釋,請regex101.comfirstsecond正則表達式。

+0

它是否考慮到換行符?因爲在我看到的一個例子中,當使用'/ [^ 0-9] + /'時,只有數字4的行是匹配的。但是當使用'm/[^ 0-9] + /'並且在同一行使用chop()函數時,只有4行的行不再匹配。 –

+0

我完全不明白你的意思。你爲什麼不嘗試自己?你也可以'使用'重新'調試';'獲得更多的解釋。 – simbabque

2

正則表達式和以正則表達式爲操作數的匹配運算符之間有區別。

您只有兩個正則表達式 - ^[^0-9]+$[^0-9]+。選項3使用與選項2相同的正則表達式,但它使用不同版本的匹配運算符。

1和2之間的區別在於1錨定在字符串的開始和結尾,而2根本沒有錨定。

所以1表示「匹配字符串的開頭,後跟一個或多個非數字,後跟字符串的結尾」。 2表示「在字符串中的任何位置匹配一個或多個非數字」。

這有幫助嗎?

+0

2/3是否認爲換行符是匹配?因爲在我看到的一個例子中,數字「4」在它自己的行上,當使用/ [^ 0-9] + /時,它與該行匹配。但是,當使用chop()函數並刪除換行符時,該行不再匹配。 –

+0

你的問題是「換行匹配'[^ 0-9]',那麼我會認爲測試非常簡單 - 'perl -E'say」\ n「=〜/ [^ 0-9]/?「是」:「否」「(打印」是「) –

1

模式[^0-9]是共同的這三個正則表達式,並會匹配任何單個字符十進制數字

  1. /^[^0-9]+$/

    的模式開始,並堅稱它包含一個或多個非數字字符

    該回音^是匹配字符串開頭的零寬度錨點

    美元符號$也是一個零寬度錨點,它將匹配字符串末尾或換行符之前的換行符,如果換行符是最後在字符串中。因此,這將匹配"aaa""aaa\n"但不"aa7bb\n"

  2. /[^0-9]+/

    這種說法沒有錨,所以會返回如果字符串包含至少一個非數字字符的任意位置

    它將匹配"12x345"失敗以匹配"12345"。注意,尾隨的換行符計數作爲一個非數字字符,所以這種模式會匹配"123\n"

  3. m/[^0-9]+/

    這是相同的#2,但與m放置明確。如果您使用默認斜槓作爲分隔符,則這是不必要的,但如果您匹配的文件路徑模式本身包含斜槓,則可以方便地使用其他模式

    使用m可讓您選擇您的自己的定界符,例如m{/my/path}代替/\/my\/path/

在本質上,#1被詢問是否該字符串全由非數字字符,而#2和#3是相同的,並測試是否字符串包含至少一個非數字字符

+0

2/3認爲換行符是匹配嗎?因爲在我看到的一個例子中,數字「4」在它自己的行上,當使用/ [^ 0-9] + /時,它與該行匹配。但是,當使用chop()函數並刪除換行符時,該行不再匹配。 –

+0

@ J.Doe:是的。換行符就像'$'之外的每個正則表達式的其他字符一樣。正如我所說的,只要內部有一個非數字,'[^ 0-9] +'就會匹配至少包含一個字符的任何內容。所以它會匹配'「\ n」'很好。當您從文件或終端讀取文本行時,您必須* chomp結果,因爲換行符會混淆您所做的任何檢查。檢查一個全數字輸入應該是'next,除非/ \ S /而不是/ \ D /',即跳過這​​一行,除非有非空白並且沒有非數字 – Borodin