我希望使用正则表达式匹配以下两行: -
abcmnoxyz
=========
第一行基本上是随机的,第二行将是有限数量的可能的所有相同的字符(=, - 可能还有几个)。线条可能需要相同的长度,但如果它们不是必须的话会很好。可以有多个RE,每个可能的一个RE'下划线'字符。
有人能想出办法吗?
答案 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+$
而且,感谢Ashish Ranjan,假设你想在第一行有=
和/或-
,请使用以下内容:
^(.+)\v(-|=)\2+$
甚至可以让你拥有像“=====”这样的第一行。但是,如果OP考虑到这一点,我会怀疑。看example 3
答案 2 :(得分:0)
根据您的示例,您可以使用带有替换和范围运算符的扩展正则表达式。 -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