regex lookarounds:如何使用可选的前瞻提取完全匹配

时间:2018-02-14 11:23:46

标签: regex qt

描述问题:

我有一些带有邮件标题行的文本,如

From: me
To: you
Subject: welcome, this is a long line of subject with two 
         lines of text
Attachements: welcome.jpg, foo.pdf

最后一行('Attachements:welcome.jpg,foo.pdf')是可选的。 所以也许这个文字看起来像

From: me
To: you
Subject: welcome, this is a short line of subject

我需要提取主题行,而不是文本'主题:'。前导和尾随空格都没问题。

我可以使用的唯一操作是单个QT-Regex调用,它只返回一个完整的匹配

很好,不是吗?

我尝试了成功

(?<=Subject:)(?:\s*)(.*)(?=Attachements:)

但如何制作'附件:' - 行可选?

如果没有Attachement:-line,我希望文本/字符串以Subject:-line(s)结束。

任何想法?

2 个答案:

答案 0 :(得分:0)

您可以对(?!...)

使用否定lookeahead Attachments
(?<=^Subject: )(?:(?!^Attachements:)[\s\S])+

Demo

顺便说一下。我已将.*更改为[\S\s]*以允许该主题中的换行符。

答案 1 :(得分:0)

您可以使用

(?<=Subject:)\s*((?:(?![\r\n]Attachements:).)*)

请参阅regex demo

模式匹配:

  • (?<=Subject:) - 与字符串内的位置匹配的正向lookbehind,其中紧邻当前位置左侧有Subject:子字符串
  • \s* - 0+空白字符
  • ((?:(?![\r\n]Attachements:).)*) - 捕获匹配任何字符(QRegExp正则表达式.模式的第1组甚至匹配换行符),尽可能多地重复零次(*) ,这不会启动CR / LF + Attachments:字符序列。此构造称为tempered greedy token