我正在尝试匹配以下内容:
str = "---title: Some Title\ndate: 01/01/2012---\n\nSome other stuff---\n\n"
我想得到:
"title: Some Title\ndate: 01/01/2012"
所以,我想出的正则表达式是:
~r/---(.+)---(.+)/s
不幸的是,贪婪和匹配:
"title: Some Title\ndate: 01/01/2012---\n\nSome other stuff"
我也尝试过非贪婪的算子,但也失败了:
(~r/---(.+)---(.+)?.*/s
任何建议都会非常有用。
由于
答案 0 :(得分:2)
使用string.scan
功能,如下所示。
> str = "---title: Some Title\ndate: 01/01/2012---\n\nSome other stuff---\n\n"
> str.scan(/---([\s\S]+?)---/)[0][0]
=> "title: Some Title\ndate: 01/01/2012"
上述扫描函数的输出是二维数组,因为存在捕获组。 [\s\S]+?
非贪婪地匹配一个或多个空格或非空格字符。请注意,此模式也会与换行符匹配( \n
,\r
)。
答案 1 :(得分:0)
答案 2 :(得分:0)
答案 3 :(得分:0)
这里的正确方法不是尝试匹配您要提取的部分,而是匹配您要丢弃的部分并使用split
。
s.split(/---\n*/)
#=> ["", "title: Some Title\ndate: 01/01/2012", "Some other stuff"]
str.split(/---\n*/)[1]
#=> "title: Some Title\ndate: 01/01/2012"
答案 4 :(得分:0)
如果你最终想要标题和日期字符串,你也可以直接把它们拉出来:
str.scan(/---title:\s+([^\n]+)\ndate:\s+(\d{2}\/\d{2}\/\d{4})/)
#=> [["Some Title", "01/01/2012"]]
答案 5 :(得分:0)
一种perl方式:
#!/usr/bin/perl
use Modern::Perl;
my $str = "---title: Some Title\ndate: 01/01/2012---\n\nSome other stuff---\n\n";
$str =~ s/---(.+?)---.*?$/$1/s;
say $str;
<强>输出:强>
title: Some Title
date: 01/01/2012