正则表达式查找问题


Regular Expression Lookbehind Issue

我正试图编写一个正则表达式,从我正在构建的项目中保留的历史文件中提取文本块。目前,我计划在我的文本编辑器(textmate或升华文本2)中手动进行提取,但最终我将使用python或php将其构建成一个脚本化过程(尚未决定)。

我的历史文件中的所有历史条目的格式都是:

YYYY-MM-DD - Chris -- Version: X.X.X
====================================
- Lorem ipsum dolor sit amet, vim id libris epicuri
- Et eos veri quodsi appetere, an qui saepe malorum eloquentiam.
...
--

其中,X是在其下完成工作的版本号。

我试图提取从版本号到最后一个双划线分隔符的所有内容,该分隔符表示文本块的末尾。

我首先创建正则表达式语句来选择有效的部分标题:

(^['d]{4}-['d]{2}-['d]{2}'s-'s['w]+'s--'sVersion:'s)['d'.]+$

但当我试图将括号内的模式转换为其背后的外观时,失败了:

(?<=^['d]{4}-['d]{2}-['d]{2}'s-'s['w]+'s--'sVersion:'s)['d'.]+$ 

我一直在四处寻找,到目前为止,这种后备格式似乎是正确的。我似乎想不出我错过了什么。有什么想法吗?

正如Joey所说,php或python中没有任意长度的查找。但是PHP中有一个变通方法!'K转义序列。

来自文档:

转义序列''K导致任何以前匹配的字符被包括在最终匹配的序列中。例如,模式:

   foo'Kbar

匹配"foobar",但报告它已匹配"bar"。此功能类似于后备断言(如下所述)。然而,在这种情况下,主题在真正匹配之前的部分不必像lookbacking断言那样具有固定长度

去掉一些多余的括号[]后,您的表达式将看起来像

(?m)^'d{4}-'d{2}-'d{2}'s-'s'w+'s--'sVersion:'s'K['d.]+$

在线演示

注意:

  • (?m):是一个内联正则表达式修饰符
  • 您不需要转义字符类中的点.[.]将匹配一个点,而不是任何字符
  • 您可以在空白字符中添加一些量词:'s*'s+
  • 'w+也将匹配下划线_,因此要排除它,可以使用[^'W_]+
  • Regex真棒

PHP和Python都不允许任意长度的look-behind。所以,一旦你有了像+这样的量词,它就停止工作了。

因此,你的第一次尝试是唯一可行的方法。