2011-12-27 76 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. 使用^$意味着你正在匹配整个行(^指示行的开始,和表示端$)。第一种模式(.*)贪婪,但你的正则表达式的其余部分指出,你必须有一个空格,并且它必须以至少一个非空格字符结尾,因此(.*)匹配尽可能多,同时仍然满足满的条件正则表达式。

相关问题