1

我正在构建一个将段落拆分为句子的 Javascript 脚本。我现在正在将此代码与正则表达式一起使用:

paragraph.match( /[^\.!\?]+[\.!\?(?="|')]+(\s|$)/g );

这很好用,除了如果句子中有一个带有标点符号的单词,那么它将在那里拆分。因此,例如,如果我有一个句子,例如:Why is about.me so popular?我希望它说这是一个句子并返回一个数组 like ['Why is about.me so popular?'],但是使用这个正则表达式,它会在.in处拆分它about.me。我知道问题出在正则表达式的这一部分,[^\.!\?]因为我说它在句子中不能有结束标记标点符号。所以我真正需要的是一个只允许不是标点符号后跟空格的字符。问题是我无法弄清楚如何做到这一点。

有任何想法吗?我试过[^\.!\?(?=\s)]了,但没有奏效。有任何想法吗?

澄清:

我需要使用.match(),因为我希望能够保留标点符号。

4

5 回答 5

3

You could use a "lazy plus" (+?):

paragraph.match(/([\S\s]+?)[.!?](\s|$)/g);

This way, the match will end as soon as it hits the end of a sentence.

[\S\s] stands for "any character".

于 2013-07-20T19:30:14.330 回答
2
var arry = paragraph.split(/([.!?])\s/);
var sentences = [];
for (i=0; i < arry.length; i+=2) {
  // In case the last sentence is not delimited
  if (i < arry.length-1) {
    sentences.push(arry[i] + arry[i+1]);
  } else {
    sentences.push(arry[i]);
  }
}

为分隔符使用捕获组将分隔符添加到拆分返回的数组中。然后,您只需将其折叠以将分隔符放回末尾。这可以使用某些框架中可用的 reduce 或 foldl 方法更可爱地完成,但在本示例中我将其保留为纯 javascript。

于 2013-07-20T21:50:34.107 回答
1

因此,例如,如果我有一个句子,例如:"Why is about.me so popular?"我希望它说这是一个句子并返回一个数组 like ['Why is about.me so popular?'],但是使用这个正则表达式,它会在"."in处拆分它"about.me"

首先,您可以假设句尾标点符号必须后跟空格或输入结尾。然后,一个句子是可能的最短字符序列,后跟句子结尾的标点符号,然后是空格或输入的结尾。“最短可能序列”意味着匹配必须是非贪婪的…+?):

/*
 * ["The quick brown fox jumped over the lazy dog. ",
 *  "Why is about.me so popular? ",
 *  "Give me a break!"]
 */
("The quick brown fox jumped over the lazy dog."
  + " Why is about.me so popular?"
  + " Give me a break!").match(/[\S\s]+?[.!?](?:\s+|$)/g)

你的表情

/[^\.!\?]+[\.!\?(?="|')]+(\s|$)/g

大多是胡说八道;它相当于

/[^.!?]+[=|!.'"()?]+(\s|$)/g

不需要转义字符类中的特殊字符(除了-两个其他字符之间的 when ),并且转义它们没有任何效果(除了\-then 表示文字-)。特别是,你不能(?=…)像在字符类中那样使用断言;一个字符类已经是一个(非零宽度)断言。

于 2013-07-21T00:04:22.647 回答
0

代替匹配,使用拆分:

var sentences=paragraph.split(/\.\s/);
于 2013-07-20T18:54:06.913 回答
0

抓住所有不是时期的东西,然后是时期。([^.]。)

http://rubular.com/r/pVxAPNCNxO

编辑:
(.*?(?:. ))

http://rubular.com/r/yv9kEPrKU2

于 2013-07-20T19:51:01.503 回答