我意识到这可能不是最常用的正则表达式,但我想知道它是否有可能在理论上。
给出一个文本文件示例:
MYL3 P08590
MYL3 B2R534
MYL3 Q9NRS8
TM38A Q9H6F2
TM38A A8K9P9
TRFE P02787
TRFE O43890
TRFE Q1HBA5
TRFE Q9NQB8
TRFE Q9UHV0
ETFA P13804
KCRM P06732
KCRM Q96QL9
...只要使用正则表达式,是否可以匹配以与前一行相同的模式开头的行?匹配和替换符合条件的行(符合标准)将类似于:
MYL3 P08590
TM38A Q9H6F2
TRFE P02787
ETFA P13804
KCRM P06732
我的猜测是即使可以使用多行匹配来检查前一行,也不可能只通过正则表达式完成,因为没有定义的模式可以匹配,而只是第一行(几行)连续行中的单词。它需要将一行的开头定义为“变量”,并将下一行的开头与之比较,据我所知,单凭正则表达式是不可能的。
另一方面,一位同事声称可能取决于正则表达式的实施。我以为我会问这里的专家.. :)
答案 0 :(得分:5)
答案 1 :(得分:2)
在vim中打开文件并执行以下操作:
/^\(\([A-Z0-9]\+\)\s\+.*\n\2\)\+
看看是否有效。您可能想要:设置hlsearch,以便vim在构建时突出显示匹配的正则表达式。
编辑:
您可以从命令行运行以下命令在vim中执行替换:
<击> $ vi -c'%s / ^((([A-Z0-9] +)\ s +。)\ n \ 3。)+ / \ 2 /'file.txt 击>
很抱歉没有使用您的样品进行测试。这是替换模式,它适用于您提供的模式:
$ vi -c '%s/\(\(^[A-Z0-9]\+\)\s\+.*\n\)\(\2\s.*\n\)*/\1/' file.txt
至于搜索模式,我无法让它“跳”到下一个匹配区。它只是跳转到下一行(具有相同起始字的那一行),直到每个块的倒数第二行。