解释foo和\(foo \)之间的区别

时间:2012-11-07 09:39:37

标签: regex grep

grep "http:\/\/.*\.jpg" index.html -o

为我提供以 http:// 开头并以 .jpg

结尾的文字

所以:grep "http:\/\/.*\.\(jpg\)" index.html -o

有什么区别?是否存在可能失败的任何情况?

我使用这个正则表达式来匹配jpg,png或gif:

http:\/\/.*\.\(jpg\|png\|gif\)

与我阅读的反向引用或正则表达式分组有关。无法理解这部分\(\)

2 个答案:

答案 0 :(得分:2)

分组在正则表达式中用于两个目的。

一种用途是在使用替代品时划分正则表达式的部分内容。在你的第三个正则表达式中就是这种情况,它允许你说扩展名可以是jpg,png或gif中的任何一个。

另一个用途是反向引用。这允许您在后续正则表达式中引用与正则表达式的早期部分匹配的文本。例如,以下正则表达式匹配连续出现两次的任何字母:

\([a-z]\)\1

反向引用\ 1表示“匹配正则表达式中与第一组匹配的任何内容”。

答案 1 :(得分:1)

()元字符。即他们不匹配,但对grep有意义。

来自here

  

使用反斜杠执行分组,然后使用括号'(',   “)”

所以在上面\(\)中定义了一组由|字符分隔的匹配可能性。即您的文件扩展名。