正则表达式匹配特定字符串之后的文本直到另一个特定字符串

Regex matching a text after a specific string until another specific string

如果我有下面的例子:

X-FileName: pallen (Non-Privileged).pst

Here is our forecast

 Message-ID: <15464986.1075855378456.JavaMail.evans@thyme>

我怎样才能select文字

Here is our forecast 

在 "X-FileName .... \n" 之后直到 "Message-ID" 被排除?

我阅读了有关前瞻和后视的内容并尝试了这个但没有成功:

(?<=X-FileName:(\n)+$).+(?=Message-ID:)

应该这样做:

(?:X-FileName:[^\n]+)\n+([^\n]+)\n+(?:Message-ID:)(第 1 组是比赛)

Demo

解释:

(?:X-FileName:[^\n]+) 匹配 X-Filename: 后跟任意数量的非换行字符,而不捕获它 (?:).

\n+ 匹配任意数量的连续换行符。

([^\n]+) 匹配并捕获任意数量的非换行符的连续字符。

\n+,再次匹配任意数量的连续换行符。

(?:Message-ID:) 匹配 Message-ID: 但不捕获它 (?:)。

编辑:正如@WiktorStribiżew 提到的,将您的文本拆分成行可能是一种 easier/cleaner 检索所需内容的方法。

这里有两种方法,它们取决于更广泛的上下文。如果您期望的子字符串是第二段,只需用 \n\n(或 \r\n\r\n)拆分并从结果列表中获取第二项。

如果它是一些较大文本中的文本,请使用正则表达式。

查看 Python 演示:

import re
s='''X-FileName: pallen (Non-Privileged).pst

Here is our forecast

Message-ID: <15464986.1075855378456.JavaMail.evans@thyme>'''
# Non-regex way for the string in the exact same format
print(s.split('\n\n')[1])
# Regex way to get some substring in a known context
m = re.search(r'X-FileName:.*[\r\n]+(.+)', s)
if m:
    print(m.group(1))

正则表达式表示:

  • X-FileName: - 文字子串
  • .* - 除换行符以外的任何 0+ 个字符
  • [\r\n]+ - 1 个或多个 CR 或 LF 字符
  • (.+) - 第 1 组:除换行字符外的一个或多个字符,尽可能多。

参见regex demo