正则表达式匹配特定字符串之后的文本直到另一个特定字符串
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 组是比赛)
解释:
(?: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。
如果我有下面的例子:
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 组是比赛)
解释:
(?: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。