如何使用RE来匹配=====的行和上面的行

时间:2017-10-29 14:45:41

标签: regex

我希望使用正则表达式匹配以下两行: -

abcmnoxyz
=========

第一行基本上是随机的,第二行将是有限数量的可能的所有相同的字符(=, - 可能还有几个)。线条可能需要相同的长度,但如果它们不是必须的话会很好。可以有多个RE,每个可能的一个RE'下划线'字符。

有人能想出办法吗?

4 个答案:

答案 0 :(得分:1)

这个正则表达式应该做你想做的事情:

regex = "(.*)\n(.)\2{2,}$"

第1组将为您提供重复行之前的行

现场演示here

<强>说明

  • (.*)\n :匹配任何后跟新行的内容
  • (.)\2{2,} :捕捉一些内容,然后检查其后跟相同的字符2+更多否。时间。您不必担心重复哪个字符。 如果您有一组可以重复的字符,您可以设置如下字符集:[=-]而不是点(.

答案 1 :(得分:0)

像这样的正则表达式

^([^=\v]+)\v=+$

会做的。请查看example 1

说明:

^([^=\v]+)    # 1 or more matches of anything that is not a '=' or vertical space \v
\v=+$         # match a vertical space followed by 1 or more '='

如果你想将它扩展到更多像' - '这样的字符,你可以这样做:

^([^=\-\v]+)\v(-|=)\2+$

查看example 2

而且,感谢Ashish Ranjan,假设你想在第一行有=和/或-,请使用以下内容:

^(.+)\v(-|=)\2+$

甚至可以让你拥有像“=====”这样的第一行。但是,如果OP考虑到这一点,我会怀疑。看example 3

答案 2 :(得分:0)

使用Grep的-B标志

与轮换匹配

根据您的示例,您可以使用带有替换和范围运算符的扩展正则表达式。 -B标志告诉grep在匹配之前有多少行要包含在输出中。

$ grep -E -B1 '^(={5,}|-{5,})$' sample.txt
abcmnoxyz
=========

如果需要,您可以为其他字符添加替换,尽管边界标记应该与您制作的一致。您还可以调整匹配所需的最小连续字符数以满足您的需要。我在示例中使用了五个字符的范围,因为它是原始主题句中的标准,并且因为较短的边界标记更可能意外地匹配真正的随机文本。

与角色类匹配

另外,请注意以下内容完成相同的工作,但更简洁一点。它使用一个字符类和一个反向引用来避免交替,如果你添加更多的边界字符,这可能会变得混乱。这两个版本在匹配您的示例方面同样有效。

$ grep -E -B1 '^([=-])\1{4,}$'
abcmnoxyz
========

答案 3 :(得分:-1)

希望这有效

^([a-z]{1,})\n([=-]{1,})

\n\r您根据文件格式(unix或dos)尝试了两者

\1会给你第一行

\2会给你第二行

如果文件在文本上包含相同的模式,那么它可能会让您多次出现。

这个答案与一行中的字符数无关。

Ex:Tester