正则表达式非贪婪匹配换行符

时间:2015-01-15 04:03:16

标签: ruby regex elixir

我正在尝试匹配以下内容:

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

任何建议都会非常有用。

由于

6 个答案:

答案 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)

更通用的正则表达式是:

(?:---)?(?<key>[a-z]+)\s*:\s*(?<value>(?!\\n).+?)(?:\\n|---|$)

它在key:value中分割匹配。

DEMO

答案 2 :(得分:0)

---(?:(?!---).)*---

试试这个。看看演示。

https://regex101.com/r/fA6wE2/34

答案 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