这两个正则表达式可以给出不同的结果吗?

时间:2014-11-11 22:31:34

标签: regex perl

这两个正则表达式是否可以给出不同的结果?

perl -pe 's/.*c//s'

perl -0777 -pe 's/.*c//s'

.*c可以替换为任何内容..

.*c案例中,结果是相同的

$ echo -e 'a\nb\nc\nd' | perl -pe 's/.*c//s'
a
b

d

$ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//'
a
b

d

问题是正则表达式之间的区别,回声的东西也可以用任何东西代替。

-0777/s是否可以互换?

使用-0777同时执行/s是否毫无意义?

2 个答案:

答案 0 :(得分:3)

它们意味着完全不同的东西,并且不可互换,即使在某些情况下它们可以具有相同的结果。

  • /s使.匹配所有字符(包括换行符);没有它.通常意味着[^\n]
  • -0777表示立即读取整个文件;如果没有它,则逐行读取文件

/s不会更改解析输入的方式,-0会这样做。

-0777通常仅在您跨多行匹配时才有用(在这种情况下/s可能会有所帮助)。如果您逐行匹配,那么您是否使用/s并不重要。

例如(使用您的示例),如果您要删除最后c之前的所有内容,包括所有行,您可以使用:

echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//s'

输出:

d

答案 1 :(得分:2)

Qtax给出了一个很好的答案,我只是想举一些例子来证明它们不一样,甚至不一样。

这两个

$ echo -e 'a\nb\nc\nd' | perl -pe 's/./o/s'
o
o
o
o


$ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/./o/'
o
b
c
d

这两个

$ echo -e 'aa\nbb\ncc\ndd' | perl -0777 -pe 's/./o/'
oa
bb
cc
dd

$ echo -e 'aa\nbb\ncc\ndd' | perl -pe 's/./o/s'
oa
ob
oc
od

这两个

$ echo -e 'aa\nbb\ncc\ndd' | perl -pe 's/./o/sg'
oooooooooooo

$ echo -e 'aa\nbb\ncc\ndd' | perl -0777 -pe 's/./o/g'
oo
oo
oo
oo

这些都表明-0777和/ s不一样。