Javascript 如何正确地将这段文字分割成一系列句子?

Javascript 如何正确地将这段文字分割成一系列句子?,javascript,split,Javascript,Split,我需要把一段文字分成几个句子。下面是一个例子 北京法院称,该大亨任志强利用其前任职务受贿和挪用公款,并指控他非法致富约290万美元。但任的支持者们肯定会把这一长句子看作是他对席的尖刻评论的惩罚,并作为对席先生统治的其他潜在批评者的警告。美国政府欢迎DRV对这一建议作出迅速反应。在2016,共产党已经警告任先生,并在他公开嘲笑席先生评论中国媒体必须为党服务的评论后,让他缓刑。任先生写道:“人民政府什么时候变成了党的政府?” 需要考虑以下情况: 先生 夫人 博士 美国 2.9美元 预期结果是以下

我需要把一段文字分成几个句子。下面是一个例子

北京法院称,该大亨任志强利用其前任职务受贿和挪用公款,并指控他非法致富约290万美元。但任的支持者们肯定会把这一长句子看作是他对席的尖刻评论的惩罚,并作为对席先生统治的其他潜在批评者的警告。美国政府欢迎DRV对这一建议作出迅速反应。在2016,共产党已经警告任先生,并在他公开嘲笑席先生评论中国媒体必须为党服务的评论后,让他缓刑。任先生写道:“人民政府什么时候变成了党的政府?”

需要考虑以下情况:

  • 先生
  • 夫人
  • 博士
  • 美国
  • 2.9美元
预期结果是以下一系列句子:

  • 北京法院称,该大亨任志强利用其前任职务受贿和挪用公款,并指控他非法致富约290万美元
  • 但是任先生的支持者肯定会把这句话看作是他对席先生的贬低的惩罚,并警告其他潜在的批评席先生的规则。
  • 美国政府欢迎DRV对这一建议作出迅速反应
  • 在2016,共产党已经警告任先生,并在他公开嘲笑席先生评论说中国新闻机构必须为党服务之后,缓刑。
  • “人民政府什么时候变成了党的政府?”
  • 任先生写道
这种拆分可以在JavaScript中的单个正则表达式中实现吗?我做不到。现在,我有以下正则表达式作为起点:

[^.!?;:。!?]+?(?!Mr|Mrs|\$\d+\.)[.!?;:。!?]

我认为,这是我们能想到的最好的办法——不完美,原因已经讨论过了,但也许是一个起点

让我们=北京法院称,该大亨任志强利用其前任职务受贿和挪用公款,并指控他非法致富约290万美元。但任的支持者们肯定会把这一长句子看作是他对席的尖刻评论的惩罚,并作为对席先生统治的其他潜在批评者的警告。美国政府欢迎DRV对这一建议作出迅速反应。在2016,共产党已经警告任先生,并在他公开嘲笑席先生评论中国媒体必须为党服务的评论后,让他缓刑。任正非写道:“人民政府什么时候变成了党的政府?”;
//已知缩写或其他点结尾文本的数组,***可能***不是句子的结尾
常数ok=[“先生”、“太太”、“博士”、“美国”、“公司];
函数findEntences(){
//将整个字符串拆分为单词-用空格分隔
让words=s.split(“”);
//包含代码构造的所有句子的数组
让句子=[];
//从一个空白的句子数组开始
让newsentence=[];
words.forEach(函数(w){
//这个词不以点结尾,只要把它加到句子里就行了
如果(!w.endsWith(“.”){
新闻事件推送(w);
//如果是,但它是一个已知的缩写,只需添加它作为正常
//也允许使用单字母缩写,例如“Samuel L.Jackson”中的缩写
}else if(ok.find(x=>x==w)| | w.length==2){
新闻事件推送(w);
//如果是,但它不是一个已知的缩写,请完成句子并开始一个新的句子
}否则{
新闻事件推送(w);
push(newsentence.join)(“”);
newsentence.length=0;
}
})
//输出句子
设ul=document.createElement(“ul”);
句子。forEach(函数){
设li=document.createElement(“li”);
li.innerHTML=s;
ul.儿童(li);
})
文件.正文.附件(ul);
}

FindEntences();
另一个选项,当然也不是完美的,就是匹配您不想更改的内容,并在组中捕获您想保留的内容,以便在其后面附加一个换行符

您可以使用不希望在文本中更改的模式扩展第一个替换

在替换中,您可以检查组1是否存在。如果存在,请在替换中使用它并追加换行符。如果不存在,请返回匹配项

解释

\b(?:Mrs?|Dr)\.|\bU\.S\.|\$\d+(?:\.\d+)?(?: million)?\b|“[^“”]+”|([.!?;:。!?])\s*(?!$)
  • \b(?:Mrs?| Dr)\.
    匹配
    Mr.
    Mrs.
    Dr.
  • |
  • \bU\.S\.
    匹配
    U.S.
  • |
  • \$\d+(?:\.\d+(?:百万)?)
    匹配一个美元符号、1+位和可选小数部分、可选空格和百万
  • |
  • “[^”“]+”
    匹配从开始的
    到结束的
    ,以防止在一个问号上打断内部
  • |
  • ([.!?;:.!?]\s*)
    捕获组1,匹配字符类中列出的一个字符
  • (?!$)
    负向前看,不断言字符串的结尾,以防止在结尾处替换为额外的换行符

比如说

let pattern=/\b(?:Mrs?| Dr)\.\bU\.S\.$\d+(?:\.\d+)(?:百万)?\b |“[^”“]+”([!?:!))\S*(?!$)/g;
让我们来看一看,北京法院说,大亨任志强利用他以前的职位收受贿赂和挪用公款,并指控他非法致富