我一直在学习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
答案 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]+
表示匹配除了所有小写字母
希望这有帮助。
答案 3 :(得分:2)
^(.*)
表示匹配从行首到空格的任何内容......
([^ ]+)$
但是 - 不仅是任何空间,而是一个或多个非空格字符后面的特定空间,然后是行尾。 “到行尾的非空格字符”将是第二个匹配组。
所以人类会反过来处理:在行尾找到一组非空格字符“Potter”,然后你就找到了/ 2匹配。啊哈,有前面的空格,那之前的任何东西都是/ 1比赛,“少年X。”。
编辑:空格代表自身,不需要转义。所以要小心,你不要插入空格来美化你的正则表达式 - 它实际上意味着什么。
答案 4 :(得分:2)
在英语中,你的正则表达式^(.*) ([^ ]+)$
说,“匹配每一行都有一些数据(或没有),后跟一个空格,后跟一个或多个非空格。”
在子模式1 (.*)
中捕获了一些数据
在子模式2 ([^ ]+)
这是分组到匹配子模式中的数据:
(Junior X.) (Potter)
(Jill) (Safai)
(Dylan Schuyler) (Goode)
(Walter) (Wang)
关于你的问题:
是的,[^ ]
匹配除空格字符之外的任何内容。它不匹配“X. Potter”,你可以从转换中看到“Junior X”。匹配子模式1,而“Potter”匹配子模式2。
使用^
和$
表示您匹配整行(^
表示行的开头,$
表示结束。第一个模式(.*)
贪婪,但你的正则表达式的其余部分声明你必须有一个空格,并且它必须以至少一个非空格字符结尾,以便(.*)
匹配尽可能多地满足完整正则表达式的条件。