任何人都可以解释这个正则表达式吗?

时间:2011-12-27 20:57:03

标签: regex grep

我一直在学习BBEdit手册中的Regex / grep,除了这一部分之外它一直很顺利(它接近尾声,与以前的部分不同,不提供解释)。

我遇到困难的两大部分是[^]部分和第一部分^(。*)

首先,除了空间之外什么都不说?然后如何抓住X. Potter,在X之后有一个空格。

其次,本手册讨论了非贪婪的限定符,这些限定符的使用方式与默认情况下的最长模式不匹配,并且意外地与您的完整短语匹配。 ^(。*)如何与整行不匹配并使其成为\ 1?除了回车之外的任何事情的开始,零或多次出现?那怎么不赶上少年X.波特作为一种模式?我认为我们必须在这里使用非贪婪的限定词,但似乎没有。

最后,空格在正则表达式模式中究竟做了什么?他们代表自己,(我认为你需要这样做吗?)或一个简单的空间(不需要做 \ 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

5 个答案:

答案 0 :(得分:3)

[^ ]表示“除空格外的任何字符”

^(.*)表示“从行的开头,一组所有字符”

因此,(。*)捕获“Junior”和“X”之间的第一个空格。

我认为[^]让第一组不要太贪心。不完全确定。

空间就像任何其他人一样。 \ t通常是制表符。

答案 1 :(得分:3)

*修饰符和贪婪:

.*只是贪得无厌。但正则表达式想要成功,所以它会做各种事情(回溯等等)仍然限制*吃掉的数量。

一般来说,将.*视为:“0个字符,最多可能允许其余模式成功的字符。”

贪婪.*和非贪婪.*?之间的区别通过以下方式展示:

    "A B C D"

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

答案 2 :(得分: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 :(得分:2)

^(.*)表示匹配从行首到空格的任何内容......

([^ ]+)$但是 - 不仅是任何空间,而是一个或多个非空格字符后面的特定空间,然后是行尾。 “到行尾的非空格字符”将是第二个匹配组。

所以人类会反过来处理:在行尾找到一组非空格字符“Potter”,然后你就找到了/ 2匹配。啊哈,有前面的空格,那之前的任何东西都是/ 1比赛,“少年X。”。

编辑:空格代表自身,不需要转义。所以要小心,你不要插入空格来美化你的正则表达式 - 它实际上意味着什么。

答案 4 :(得分:2)

在英语中,你的正则表达式^(.*) ([^ ]+)$说,“匹配每一行都有一些数据(或没有),后跟一个空格,后跟一个或多个非空格。”

在子模式1 (.*)中捕获了一些数据 在子模式2 ([^ ]+)

中捕获 1个或多个非空格

这是分组到匹配子模式中的数据:

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

关于你的问题:

  1. 是的,[^ ]匹配除空格字符之外的任何内容。它不匹配“X. Potter”,你可以从转换中看到“Junior X”。匹配子模式1,而“Potter”匹配子模式2。

  2. 使用^$表示您匹配整行(^表示行的开头,$表示结束。第一个模式(.*) 贪婪,但你的正则表达式的其余部分声明你必须有一个空格,并且它必须以至少一个非空格字符结尾,以便(.*)匹配尽可能多地满足完整正则表达式的条件。