2

我这里有一个以这种方式在 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(这是什么意思?)还不够吗?我只是不明白它)。& 或 && 是什么意思?

谢谢

4

2 回答 2

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来避免大量转义使用\

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

由于\1,\2,..捕获了(). 因此,当它们用于匹配模式本身时,它们旨在匹配重复字符。

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

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


& 或 && 是什么意思?

&包含一个完整匹配的字符串。&&显然,匹配字符串的重复次数是 2 次。

例如,输入字符串abbxyz和匹配模式(.)\1然后匹配bb存储在&. 因此,&&将的价值是bbbb


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

于 2013-11-03T11:44:55.990 回答
0

\1指第一个捕获子模式,\2第二个等&是与搜索模式匹配的文本,因此它是与您正在搜索的所有内容匹配的文本(对于该特定匹配,您的缓冲区中可能有多个匹配项) .

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

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

于 2013-11-03T03:45:17.210 回答