Vim:如何使用新的正则表达式撤消正则表达式?

时间:2013-11-03 03:10:30

标签: regex vim

我这里有一个用Vi加密的文本:

1,$s/\(.\)\1/&&/g
1,$s/\(.\)\(.\)\2\2\2/\2\2\2\1\2/g
1,$s/\(.\)\(.\)\(.\)\(.\)/\3\1\4\2/g
1,$s/\(...\)\(...\)/\2\1/g

任务是为每个正则表达式编写一个新的正则表达式,以撤消更改,即所谓的文本解密。

我想出了如何撤消最后两次更改:

:1,$s/\(...\)\(...\)/\2\1/g
:1,$s/\(.\)\(.\)\(.\)\(.\)/\2\4\1\3/g

我希望你能解释一下前两个正则表达式的作用。 在正斜杠之前,\ 1或\ 2 \ 2 \ 2是什么意思?我认为在斜线之后它们会改变位置(但是仅仅编写\ 2 \ 1而不是\ 2 \ 2 \ 2 \ 1 \ 2(它是什么意思?)是不够的?)我只是没有得到它)。什么和&或者&&意思?

谢谢

2 个答案:

答案 0 :(得分:1)

尝试以下解密序列

%s/\v(...)(...)/\2\1/g
%s/\v(.)(.)(.)(.)/\2\4\1\3/g
%s/\v(.)\1{2}(.)\1/\2\1\1\1\1/g
%s/\v(.)\1{3}/\1\1/g

注意:

  1. 1,$写得很好%
  2. 使用非常神奇的说明符\v以避免使用\
  3. 进行大量转义
      

    在正斜杠之前,\ 1或\ 2 \ 2 \ 2是什么意思?

    由于\1,\2,..会捕获()内匹配的内容。因此,当它们用于匹配模式本身时,它们意味着匹配重复的字符。

    • (.)会匹配任何字符,但(.)\1只匹配字符后跟自身,或者换句话说,字符重复2次。例如。在字符串abbxyz中,它将匹配bb

    • (.)(.)\2\2\2将仅匹配一个字符,后跟另一个字符重复4次。最好写成(.)(.)\2{3}。例如。在字符串baabbbbaa中,它将匹配abbbb


      

    &和或者&&意思?

    &包含一个完整匹配的字符串。所以&&显然是重复匹配字符串的2倍。

    E.g。输入字符串abbxyz和匹配模式为(.)\1,然后匹配存储在bb中的&。因此&&的值为bbbb


    P.S。我强烈建议您在遇到此类问题之前先通过The Premier website about Regular Expressions

答案 1 :(得分:0)

\1是指第一个捕获子模式,\2是第二个,等等。&是与搜索模式匹配的文本,因此它是匹配您所有内容的文本重新搜索(对于那个特定的匹配,你的缓冲区可以有多个匹配)。

您的第一个模式匹配任何两个重复的字符。例如,abb将替换为abbbb

你的第二个模式匹配一​​个字符,后面跟着另一个字符重复4次(总共4个连续的字符实例),并用第二个字符替换三次,然后是第一个字符,然后是第二个字符。例如,abbbb将替换为bbbab