JS将文本分割成句子

4
我想要接收大量文本(例如一章书),并创建一个句子数组。
我的当前代码是:
text.match( /[^\.!\?]+[\.!\?]+["']?/g );

这仅适用于文本以 [. ! ?] 中的一个符号结尾的情况。如果最后一句没有标点符号,它将会丢失。
如何将我的文本分成句子,同时允许最后一句没有标点符号?

添加\n即新行。 - SaidbakR
仅当文本中没有其他换行符时,\n 才起作用,这似乎不太可能。 - JJJ
您可以包含一个示例,这样您将获得更相关的答案。 - Thomas Ayoub
如果你的句子中有缩写怎么办? - flec
我认为您不需要在字符类中转义 .? - David Knipe
显示剩余2条评论
4个回答

4

使用$匹配字符串的结束:

/[^\.!\?]+[\.!\?]+["']?|.+$/g

或者您希望允许在结尾处使用空白字符:

/[^\.!\?]+[\.!\?]+["']?|\s*$/g

2
正确!谢谢,但实际上你需要允许字符串末尾的字符 $。因此我把它改成了 /[^\.!\?]+([\.!\?]+["']?|$)/g,但我认为也可以使用 /[^\.!\?]+[\.!\?]+["']?|.+$/g - Mirror318
@Mirror318 /[^\.!\?]+[\.!\?]+["']?|.+$/g 运行得非常好! - Sisir
@Mirror318 你说得对,我的回答好像还缺了最后一句话。你提供的两个建议都可以使用。我已经改了我的回答。 - David Knipe

1
这取决于文本中的字符,但是

text.match( /[^\.!\?]+[\.!\?]+|[^\.!\?]+/g );

可以完成这项工作。
(如果不起作用,您能否提供几句话说明您无法匹配的内容?)

我最终得到了基本上这个结果,但是末尾还有字符串的结束符"$": text.match( /[^\.!\?]+[\.!\?]+|[^\.!\?]+$/g ); - Mirror318

1

根据您是否需要结果中的句子标点,您可以使用 "split" 函数来实现。

var txt="One potato. Two Potato. Three";
txt.split( /[\.!\?]+/ );
[ 'One potato', ' Two Potato', ' Three' ]

我尝试了 split,它很好,因为不会丢失任何内容,但是我确实需要保留标点符号。 - Mirror318

-1

你只需要使用 [^\.!\?]+,其余的都不需要:

text = "Mr. Brown Fox. hello world. hi again! hello one more time"
console.log(text.match(/[^\.!\?]+/g))


根据他原来的正则表达式,他似乎想要包括句子结束的标点符号。 - user663031
我知道,为什么你认为我的正则表达式没有做到那个? - yelsayed
3
因为我运行了这段代码片段。 - user663031

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