是否可以匹配以相同的单词/模式开头的连续行

时间:2011-08-23 12:04:54

标签: regex

我意识到这可能不是最常用的正则表达式,但我想知道它是否有可能在理论上。

给出一个文本文件示例:

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

我的猜测是即使可以使用多行匹配来检查前一行,也不可能只通过正则表达式完成,因为没有定义的模式可以匹配,而只是第一行(几行)连续行中的单词。它需要将一行的开头定义为“变量”,并将下一行的开头与之比较,据我所知,单凭正则表达式是不可能的。

另一方面,一位同事声称可能取决于正则表达式的实施。我以为我会问这里的专家.. :)

2 个答案:

答案 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

至于搜索模式,我无法让它“跳”到下一个匹配区。它只是跳转到下一行(具有相同起始字的那一行),直到每个块的倒数第二行。