我正在构建一个将段落拆分为句子的Javascript脚本。我正在使用带有正则表达式的代码来执行此操作:
paragraph.match( /[^\.!\?]+[\.!\?(?="|')]+(\s|$)/g );
除了在句子中有一个带有标点符号的单词然后将其拆分在那里之外,这种方法效果很好。例如,如果我有一句话:Why is about.me so popular?
我希望它说这是一个句子并返回一个像['Why is about.me so popular?']
这样的数组,但是这个正则表达式将它拆分为.
在about.me
。我知道这个问题出现在正则表达式[^\.!\?]
的这一部分中,因为我说它在句子中不能有结束标记符号。所以我真正需要的是只允许不是标点符号后跟空格的字符。问题是我无法弄清楚如何做到这一点。
有什么想法吗?我试过了[^\.!\?(?=\s)]
,但那没用。有什么想法吗?
澄清:
我需要使用.match()
,因为我希望能够保留标点符号。
答案 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)