正则表达式匹配所有标点符号后跟空格或结尾的字符串

时间:2013-07-20 18:46:02

标签: javascript regex

我正在构建一个将段落拆分为句子的Javascript脚本。我正在使用带有正则表达式的代码来执行此操作:

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

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

有什么想法吗?我试过了[^\.!\?(?=\s)],但那没用。有什么想法吗?

澄清:

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

5 个答案:

答案 0 :(得分:2)

您可以使用“懒惰加”(+?):

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

这样,匹配将在一个句子结束后立即结束。

[\ S \ s]代表“任何角色”。

答案 1 :(得分: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]);
  }
}

使用捕获组作为分隔符会将分隔符添加到split的返回数组中。然后你只需要折叠它就可以将分隔符放回到最后。使用某些框架中提供的reduce或foldl方法可以更好地完成这一点,但是我将它保留为纯javascript用于此示例。

答案 2 :(得分:1)

  

所以例如,如果我有一句话:"Why is about.me so popular?"我希望它说这是一个句子并返回一个类似['Why is about.me so popular?']的数组,但是这个正则表达式将它拆分为{{ 1}} "."

首先,您可以假设句子结尾标点符号必须后跟空格或输入结束。然后一个句子是最短的字符序列,后跟句子结尾的标点符号,后跟空格或输入的结尾。 “最短可能序列”表示匹配必须非贪婪"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 时,在两个其他字符之间),并且转义它们没有效果({ {1}}然后表示文字-)。特别是,你不能在字符类中使用像\-这样的断言;字符类已经一个(非零宽度)断言。

答案 3 :(得分:0)

使用split:

而不是匹配
var sentences=paragraph.split(/\.\s/);

答案 4 :(得分:0)

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

<击>

<击> http://rubular.com/r/pVxAPNCNxO

编辑:
(。*?(?:。))

http://rubular.com/r/yv9kEPrKU2