我这里有一个用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(它是什么意思?)是不够的?)我只是没有得到它)。什么和&或者&&意思?
谢谢
答案 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,$
写得很好%
\v
以避免使用\
在正斜杠之前,\ 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