Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 反斜杠如何影响正则表达式中的大括号?_Regex_Sed_Grep - Fatal编程技术网

Regex 反斜杠如何影响正则表达式中的大括号?

Regex 反斜杠如何影响正则表达式中的大括号?,regex,sed,grep,Regex,Sed,Grep,所以我开始在linux中使用grep和sed学习正则表达式,我不明白为什么我必须保存花括号?因此,保存意味着转义字符以逐字匹配,但当我键入grep'test{2}时,它将只匹配test{2},当我键入'test\{2}时,它将匹配testtest。没关系,但为什么反斜杠还有其他修饰符的用法呢?例如,在(点)的情况下,当我键入测试时。它将匹配任何文本,测试后跟任何字符。在这种情况下,我们需要反斜杠将其解释为字符。所以当我这样使用它时:test\。它只会匹配test。 总结如下:为什么在{的情况下,

所以我开始在linux中使用
grep
sed
学习正则表达式,我不明白为什么我必须保存花括号?因此,保存意味着转义字符以逐字匹配,但当我键入
grep'test{2}
时,它将只匹配
test{2}
,当我键入
'test\{2}
时,它将匹配
testtest
。没关系,但为什么反斜杠还有其他修饰符的用法呢?例如,在
(点)的情况下,当我键入
测试时。
它将匹配任何文本,测试后跟任何字符。在这种情况下,我们需要反斜杠将其解释为字符。所以当我这样使用它时:
test\。
它只会匹配
test。

总结如下:为什么在
{
的情况下,反斜杠将大括号保存为字符,而在其他修饰符的情况下,如
反斜杠将字符保存为特殊字符


我知道这听起来很搞笑,但我不明白…

grep
与no
-E
一起使用时,您需要避开(“保存”)作为量词的大括号,因为使用的正则表达式味道是POSIX-BRE

grep 'test\{2\}' file # => Finds lines having testt, not testtest

相同的POSIX ERE变体如下:

grep -E 'test{2}' file
grep -E '(test){2}' file
另一个示例是匹配花括号:

grep '{2}' file # => matches lines having {2} in them
grep -E '\{2}' file => same, note the } is not special


BRE和ERE POSIX语法之间的差异只是历史性的,似乎没有具体的概念。

您应该了解BRE POSIX正则表达式标准及其与POSIX ERE的差异。此外,
test\{2\}
只匹配
testt
testt
部分。尝试使用
grep--color=always
突出显示匹配的子字符串。阅读POSIX BRE和ERE规范at以及GNU grep和GNU sed手册页,了解它们如何使用BRE和ERE(以及GNU grep PCREs,如果您愿意深入研究的话,可以通过谷歌搜索)。这不是“好笑”。这是一个混乱的来源!简短的解释:随着时间的推移,正则表达式有许多不同的风格。语法不断演变,两种主要方言幸存下来。
grep '{2}' file # => matches lines having {2} in them
grep -E '\{2}' file => same, note the } is not special