JS:将条目与捕获组匹配,占新行

Posted

技术标签:

【中文标题】JS:将条目与捕获组匹配,占新行【英文标题】:JS: matching entries with capture groups, accounting for new lines 【发布时间】:2015-06-23 19:00:19 【问题描述】:

鉴于此文本:

1/12/2011
I did something.

10/5/2013
I did something else.

Here is another line.

And another.

5/17/2014
Lalala.
More text on another line.

我想使用正则表达式(或者其他方法?)来得到这个:

["1/12/2011", "I did something.", "10/5/2013", "I did something else.\n\nHere is another line.\n\nAnd another.", "5/17/2014", "Lalala.\nMore text on another line."]

日期部分内容部分分别是独立的条目,交替出现。

我尝试使用 [^] 代替点,因为 JS 的 .* 不匹配新行(如Matching multiline Patterns 所说),但是匹配是贪婪的并且占用太多,所以结果数组只有1 个条目:

var split_pattern = /\b(\d\d?\/\d\d?\/\d\d\d\d)\n([^]+)/gm;
var array_of_mems = contents.match(split_pattern);

// => ["1/12/2011↵I did something else..."]

如果我添加一个问号来获得 [^]+?,根据How to make Regular expression into non-greedy? 使匹配非贪婪,那么我只会获得内容部分的第一个字符。

最好的方法是什么?提前致谢。

【问题讨论】:

【参考方案1】:
(\d1,2\/\d1,2\/\d4)\n|((?:(?!\n*\d1,2\/\d1,2\/\d4)[\s\S])+)

你可以试试这个。抓住捕获。查看演示。

https://regex101.com/r/sJ9gM7/126

var re = /(\d1,2\/\d1,2\/\d4)\n|((?:(?!\n*\d1,2\/\d1,2\/\d4)[\s\S])+)/gim;
var str = '1/12/2011\nI did something.\n\n10/5/2013\nI did something else.\n\nHere is another line.\n\nAnd another.\n\n5/17/2014\nLalala.\nMore text on another line.';
var m;

if ((m = re.exec(str)) !== null) 
if (m.index === re.lastIndex) 
re.lastIndex++;

// View your result using the m-variable.
// eg m[0] etc.

【讨论】:

感谢您的精彩回答! "?:" 仅适用于 "(?!\n*\d1,2\/\d1,2\/\d4)" 还是适用于 "(( ?!\n*\d1,2\/\d1,2\/\d4)[\s\S])+" ?语法告诉我后者,但是我不明白“我做了某事”之类的内容是如何匹配的,因为“?:”意味着不捕获匹配项。【参考方案2】:

您可以在循环中使用exec() 方法来获得您想要的结果。

var re  = /^([\d/]+)\s*((?:(?!\s*^[\d/]+)[\S\s])+)/gm, 
matches = [];

while (m = re.exec(str)) 
  matches.push(m[1]);
  matches.push(m[2]);

输出

[ '1/12/2011',
  'I did something.',
  '10/5/2013',
  'I did something else.\n\nHere is another line.\n\nAnd another.',
  '5/17/2014',
  'Lalala.\nMore text on another line.' ]

eval.in

【讨论】:

我能否得到一些关于正则表达式的解释 - [\d/]+ 是如何工作的?似乎一个关键的想法是使用 [\S\s] ......这到底是什么?或者只是关于一般正则表达式的关键点,因为我想理解它而不是简单地复制它。我会调查 ?: 和 ?! - 非捕获组和负前瞻我认为......这些是我在尝试编写自己的正则表达式时没有考虑的关键想法。谢谢!

以上是关于JS:将条目与捕获组匹配,占新行的主要内容,如果未能解决你的问题,请参考以下文章

Javascript全局匹配与捕获组[重复]

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

将字符串与元组列表匹配

[javascript] 获取正则子表达式里的内容

正则表达式与新行之间的内容不匹配 (\r\n)

js正则表达式 匹配两个特定字符间的内容