我有这个文字
XXX
text
XXX
XXX
text
XXX
XXX
text
XXX
我希望捕获XXX和XXX之间的文字。 (我试图从书中找出章节)
/XXX.*XXX/
这将捕获第一个开头和最后一个结尾
/XXX.*?XXX/
这将跳过每一章
非常感谢 巴拉
答案 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
来允许.
匹配换行符。