基于前面的连续字符,在JavaScript中将字符串按'.'分割

4
我有一个字符串需要分成段落。我可以使用.split('. ')轻松做到这一点,并将'.'字符附加到每个字符串-然后我就有了一个句子数组。但是,如果字符串中有缩写的中间名字,比如John D. Doe,那么就会出现问题。
如果不是JavaScript,我会使用lookbehind,但是它确实是JavaScript。
我该如何将字符串分成一组句子,由两个或多个字母数字字符跟随一个句点分隔?
我认为这样会起作用-.split(/(?:\w{2}\.)\s/g) - 但它不包括匹配中的分隔符,相反,我失去了每个分割句子的最后一个字符和句点。

4
“我去了拉什莫尔山” - Aioros
是的。同样的情况 - 没有考虑到两个字母的截断。谢谢。 - Nathan
一个稍微不同的方法是检查你的单词是否以大写字母开头,而不是以 . 开头。 - Dominic Green
@Dominic Green但那仍然可以匹配像“etc.”这样的缩写。 - grexter89
@DominicGreen:“John D. Doe”和“Mrs. Doubtfire于1994年2月24日上映”。 - GitaarLAB
显示剩余2条评论
3个回答

1
你可以通过反转字符串和正则表达式并使用前瞻来模拟“向后查找”。参考:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
String.prototype.reverse = function () {
  return this.split('').reverse().join('');
};
var string = "John D. Doe and Mrs. DoubtFire went to Mt. Washington on 25 Feb. 1999. Another sentence.";
var newString = string.reverse().split(/\s(?=\.\w{4})/).map( function(a){ return a.reverse(); } ).reverse();

编辑:你还需要在数组上进行另一个.reverse()操作,否则你的句子顺序会出错。

是的,但这适用于“拉什莫尔山”和“双面佛夫人”的问题。 - Synthetx
而且仍然没有理由使用split,反转字符串,通过修改String.prototype来打破封装等。你可以同样轻松地用match来“解决”这个问题。 - Dagg Nabbit
你能否解释一下,相比于仅使用 string.match(/.*?\w{4,}\./g),所有这些代码可能具有的潜在优势是什么? - Dagg Nabbit
@Synthetx,抱歉,我不是故意无礼的,只是我必须处理很多不必要复杂的代码,这往往会让我感到不舒服。 - Dagg Nabbit
@Dagg Nabbit:我知道你的感受 :) - Synthetx
显示剩余3条评论

0
如何将字符串分割成一组句子,由两个或多个字母数字字符后跟一个句点分隔?
如果这些是唯一的限制条件,您可以匹配以下模式:match
/.*?\w{2,}\./g

然而,这并不能解决评论中提到的“拉什莫尔山”和“双面女郎”的问题。

在这里关键是使用match而不是split,因此您不需要使用回顾断言。

http://jsfiddle.net/6tnQ3/


-1

我认为你可以在段落末尾使用\n而不是.。这样,您可以轻松地将它们拆分,而不必担心可能用于文本中的字符之间的冲突。


1
不是如果我按照你说的做 - 原始文本是一个字符串,所以\n不存在。 - Nathan
你可以使用正则表达式测试来识别“end.”模式,其中end是一个多于一个字符的单词。通过这种方式,你将找到每个句子的结尾。 - Behrad Farsi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接