RegEx如何在两个字符串之间查找文本

时间:2011-09-09 11:26:50

标签: regex

我有这个文字

XXX
text 
XXX

XXX
text 
XXX

XXX
text 
XXX

我希望捕获XXX和XXX之间的文字。 (我试图从书中找出章节)

 /XXX.*XXX/

这将捕获第一个开头和最后一个结尾

 /XXX.*?XXX/

这将跳过每一章

非常感谢 巴拉

4 个答案:

答案 0 :(得分:4)

如果您的文字包含换行符(\n),则需要将“点匹配的换行符”切换添加到正则表达式,并使您的匹配“非贪婪”:

/(?s)XXX.*?XXX/

编辑:感谢Alan的评论 - 我的错误开关:(?s)是正确的

答案 1 :(得分:2)

使用sed

的解决方案
$ sed -n '/XXX/,/XXX/{n;p}' text
text 

text 

text 

答案 2 :(得分:1)

如果这个XXX字符串总是在单独的行中,我建议简单地迭代行并“手动”选择它。它应该比多行正则表达式更快。<​​/ p>

python:

delim = "XXX"
inside = False
lines = []
idx = 0
for line in file:
    if line.strip() == delim:
        inside = not inside
        if inside: lines.append([])
        else: idx += 1
    elif inside:
        lines[idx].append(line)

答案 3 :(得分:0)

您的说明与您的示例不符。如果XXX应该代表章节标题,那么每章的开头只会有一个。要检测章节的结尾,您需要对下一章标题进行预测:

/XXX.*?(?=XXX)/s

除了最后一章,这应该适用于所有人;匹配你可以使用\z,结束锚:

/XXX.*?(?=XXX|\z)/s

如果我们知道你正在使用哪种正则表达式的味道,那真的会有所帮助。例如,在Ruby中,您必须使用/m而不是/s来允许.匹配换行符。