2011-12-27 77 views
1

我一直在學習BBEdit手冊中的Regex/grep,除了這個部分外,它一直很流暢(它接近尾聲,而不像以前的章節不提供解釋)。我有任何人都可以解釋這個正則表達式模式?

兩個大的部分困難是[^]部分,第一部分^(。*)

首先,是說什麼,但一個空間?那麼它是如何抓住X. Potter,在X之後留出空間?其次,手冊討論了非貪婪修飾符,這些修飾符默認情況下不會匹配最長的模式,並且意外地匹配您的整個短語。 ^(。*)如何不匹配整行並使其成爲\ 1?行的開始,零次或多次除了回車之外的任何事情?那怎麼能抓住Junior X. Potter作爲一種模式?我認爲我們必須在這裏使用一個非貪婪的限定詞,但它似乎不是。

最後,空間在正則表達式模式中究竟做了什麼?他們代表自己,(我認爲你不需要那麼做嗎?)或者一個簡單的空間(不需要做\ space來逃脫它)。

Rearranging Name Lists 
You can use grep patterns to transform a list of names in first name first form to last name first order (for a later sorting, for instance). Assume that the names are in the form: 
Junior X. Potter 
    Jill Safai 
    Dylan Schuyler Goode 
    Walter Wang 
If you use this search pattern: 
^(.*) ([^ ]+)$ 
And this replacement string: 
\2, \1 
The transformed list becomes: 
Potter, Junior X. 
    Safai, Jill 
    Goode, Dylan Schuyler 
    Wang, Walter 

回答

2

^(.*)表示匹配從線到空間開始什麼...

([^ ]+)$但是 - 不僅僅是任何空間,而是一個或多個非空格字符之後的特定空間,然後是行尾。 「到行尾的非空格字符」將成爲第二個匹配組。

所以人類會反過來處理:在行尾找到非空白字符組「Potter」,然後找到/ 2匹配。啊哈,有前面的空間,那麼之前的任何東西都是1/1比賽,「Junior X.」。

編輯:空格表示自己,它不需要轉義。所以要小心,不要插入空格來美化你的正則表達式 - 它實際上意味着什麼。

+0

啊,這很有道理,謝謝。 – 2011-12-27 21:14:33

3

[^ ]裝置

^(.*)手段「從行的開始,一組中的所有字符的」,「除的空間中的任何字符」

所以,(。*)捕獲第一「Junior」和「X」之間的空間

我認爲[^]讓第一組過於貪婪。不完全確定。

空間就像任何其他人一樣。 \ t通常是一個製表符。

+1

'.'通常不符合換行符。 – 2011-12-27 21:06:31

+0

感謝您的澄清。我沒有直接回答這個問題。 – lvmisooners 2011-12-27 21:14:20

2

的符號(^)符號是正則表達式有點混亂,它有兩個含義:

1)當在表達式中的開始時使用它行的開頭相匹配。所以

^a would mean any lines that begin with a 

2)當字符選擇器內部使用這意味着字符的稱讚(即所有但這些字符,以便:

[^xyz]裝置匹配一個字符,任何東西,除了x或Y或Z

[^a-z]+手段匹配除了小寫字母匹配任何

希望這有助於一個或多個字符。

其中一個更好的教程是http://www.proftpd.org/docs/howto/Regex.html

3

*改性劑和貪婪:

.*只有貪婪,因爲它可以。但正則表達式想要成功,所以它會做各種事情(回溯等等),以限制*所吃的量。

在一般情況下,認爲.*的存在:「0個字符,最多最可能的字符,這將仍然允許模式成功的其餘部分。」

貪婪.*和非貪婪.*?之間的區別通過演示了:

"A B C D" 

    /^(.*)/ → "A B C" 
    /^(.*?)/→ "A" 
2

在英語中,您的正則表達式^(.*) ([^ ]+)$說:「匹配每行只有一些數據(或沒有),後跟一個空格,後跟一個或多個非空格。」

一些數據在子模式被捕獲1 (.*)
1或多個非空格在子模式2 ([^ ]+)

捕獲這是分組到匹配子模式的數據:

(Junior X.) (Potter) 
(Jill) (Safai) 
(Dylan Schuyler) (Goode) 
(Walter) (Wang) 

關於您的問題:

  1. 是的,[^ ]與除空格字符以外的任何內容匹配。它不匹配「X.波特」,你可以從「青少年X」的變革中看到。是匹配子模式1,而「波特」匹配子模式2.

  2. 使用^$意味着你正在匹配整個行(^指示行的開始,和表示端$)。第一種模式(.*)貪婪,但你的正則表達式的其餘部分指出,你必須有一個空格,並且它必須以至少一個非空格字符結尾,因此(.*)匹配儘可能多,同時仍然滿足滿的條件正則表達式。

相關問題