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:将条目与捕获组匹配,占新行的主要内容,如果未能解决你的问题,请参考以下文章