从文本文件中我将每一行加载到变量($line
)中.每一行都有一般形式,但不一致,例如
[Foo] - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt £34.99 [BARBAR] ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis £255.25 [BAZZ] - deserunt mollit anim id est laborum. - £500
对于每一行,我想要一个字符串
没有方括号
不包含前导空格或非字母数字字符,例如' - '
为了进一步复杂化,我想将价格作为一个不同的变量返回.
以上数据的几个例子:
$var1 = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt'; $var2 = '£99.99'; $var1 = 'ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis'; $var2 = '£255.25'; $var1 = 'deserunt mollit anim id est laborum'; $var2 = '£500';
我真的不知道从哪里开始(对我来说)一个非常复杂的正则表达式.
编辑边缘案例......
事实证明,在文本文件中有一些我的描述没有涵盖的边缘情况,例如:
[BARBAR] ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis £255.25 (5% off) [BAZZ] - deserunt mollit anim id est laborum. - £500 (%10 less)
理想情况下,我想将值(例如,'减少10%','减5%')存储在一个被调用的变量中($discount
如果存在的话).
我不断看到有人试图将一个正则表达式过多地塞进一个正则表达式
我会这样做的
从字符串的开头删除括号中的子字符串,后跟任意数量的非单词字符
删除任意数量的非单词字符,后跟价格,并从字符串末尾删除可选的空格,捕获价格
$price
如果找到一个,则分配捕获
单独处理前缀和后缀使得编写清晰的解决方案变得更加容易,如下所示.不幸的是,描述前缀的括号和反斜杠的混乱无法改进,除非你想使用\[ [^][]* \]
我认为没有明显更好的
use strict; use warnings 'all'; use feature 'say'; while ( ) { chomp; s/ ^ \[ [^\[\]]* \] \W* //x; my $price; $price = $1 if s/ \W* (£[\d.]+)? \s* \z //x; say $_; say $price if $price; } __DATA__ [Foo] - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt £34.99 [BARBAR] ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis £255.25 [BAZZ] - deserunt mollit anim id est laborum. - £500
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt
£34.99
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
£255.25
deserunt mollit anim id est laborum
£500