如何在javascript中使用正则表达式匹配段落?

时间:2016-10-21 17:42:58

标签: javascript regex

我想要一个匹配段落的正则表达式,例如:

  

红褐色的狐狸做了些什么。   [换行]我不记得这篇文章。

     

[换行符]

     

[换行符]   所以,相反,我会说等等等等。   [换行] Blah。

将返回如下数组:

['The red brown...', 'So instead I'll say...']

我已经有了这个正则表达式(我偷了,嘘):/(?:[^\r\n]|\r(?!\n))+/gm

但是,此模式匹配换行符(一个换行符)和段落符号(两个换行符)。如何匹配段落之间的文本正文,但不能在单个换行符之间拆分匹配?

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式/(.+)((\r?\n.+)*)/gm仅捕获可被视为段落的内容。根据您的描述,段落可以包含普通文本和单行换行符。以下示例实现了此解决方案。

// Orignial input
var input = `

    The red brown fox, did something.
I don't remember this text

So, instead I'll say blah blah. 
Blah.

another paragraph
`;

document.write('<code>ORIGNIAL</code><pre>' + input + '</pre><hr>');

var 
  regex = /(.+)((\r?\n.+)*)/gm,
  matches, output = []; // output is used to store all paragraphs

while (matches = regex.exec(input)) {
  output.push(matches[0]);
  document.write('<code>PARAGRAPH ' + output.length + '</code><pre>' + matches[0] + '</pre><hr>');
}
pre {
  background-color: lightGray;
  margin: 2px 0;
}
hr {
  border: none;
  margin:0;
  padding:0;
}

答案 1 :(得分:0)

您可以使用{2,} limiting quantifier分隔换行符(序列,取决于换行符样式):

var s = "The red brown fox, did something.\r\nI don't remember this text.\r\n\r\nSo, instead I'll say blah blah.\r\nBlah.";    
console.log(s.split(/(?:\r\n){2,}/));

因此,/(?:\r\n){2,}/匹配2个或更多个连续的CR + LF序列。如果换行符样式仅为LF,请使用更简单的/\n{2,}/模式。