我正试图编写一个正则表达式,从我正在构建的项目中保留的历史文件中提取文本块。目前,我计划在我的文本编辑器(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。所以,一旦你有了像+
这样的量词,它就停止工作了。
因此,你的第一次尝试是唯一可行的方法。