正则表达式跨双换行符

时间:2018-09-26 13:46:51

标签: regex

我有以下内容,我需要补充其中的内容:

isTranslucent

我需要提取部分文本,几乎可以使用以下正则表达式来做到这一点:

[Firstname LastName 21/06/2018 - 17:27]
Lorem Ipsum

[Foo Bar 25/01/2017 - 12:10]
Lorem Ipsum - First line
Lorem ipsum Second line
Lorem ipsum third line


Some other random text

一切正常,除了标记为\[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\n*(?<note>.+) 的组外,其他所有内容都仅出现在注释的第一行。如果注释中有换行符,则换行符之后的所有内容都不会被提取。

在正则表达式找到双行换行符之前,如何才能使其与注释部分中的所有文本匹配?

3 个答案:

答案 0 :(得分:1)

您可以查找.或下一个方括号之前的每个字符,然后查找两个换行符,而不是寻找[^[](默认情况下不包括换行符)。

\[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\n*(?<note>[^[]+\n\n)

https://regex101.com/r/12S3ZQ/3

答案 1 :(得分:1)

我已经修改了您的原始正则表达式,以便为您提供预期的输出。

\[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\n*(?<note>.+\n?\n?)+

它应该匹配所有内容,直到双行中断为止,注意唯一的变化是在末尾。

而不是...

(?<note>.+)

现在...

(?<note>.+\n?\n?)+

编辑:更改了正则表达式,使其包含以一个换行符分隔的行,但不能包含两个换行符。

答案 2 :(得分:0)

您可以使用

\[(?<name>\w+? \w+?) (?<date>\d{2}\/\d{2}\/\d{4}) - (?<time>\d{2}:\d{2})\]\s*(?<note>[\s\S]+?)(?=\n{2}|$)

请参见regex demo

(?<note>[\s\S]+?)(?=\n{2}|$)将匹配1个以上的字符,并尽可能少地匹配前2个换行符或字符串末尾。

如果您的正则表达式引擎支持\R构造以匹配任何换行符序列,则可以使用(?=\R{2}|$)