用于将文本拆分为句子并保留分隔符的 Javascript RegExp

IT技术 javascript regex sentence
2021-03-09 15:28:04

我正在尝试使用 javascript 的拆分从字符串中获取句子,但保留分隔符,例如 !?。

到目前为止我有

sentences = text.split(/[\\.!?]/);

哪个有效但不包括每个句子的结尾标点符号 (.!?)。

有谁知道这样做的方法吗?

5个回答

您需要使用匹配而不是拆分。

试试这个。

var str = "I like turtles. Do you? Awesome! hahaha. lol!!! What's going on????";
var result = str.match( /[^\.!\?]+[\.!\?]+/g );

var expect = ["I like turtles.", " Do you?", " Awesome!", " hahaha.", " lol!!!", " What's going on????"];
console.log( result.join(" ") === expect.join(" ") )
console.log( result.length === 6);
哇,这个东西也能捕获省略号。 var str = "I like turtles... Do you? Awesome! hahaha. lol!!! What's going on????";
2021-04-18 15:28:04
这在有浮点数时会中断: Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum"
2021-04-22 15:28:04
您可以使用拆分:text.split(/\b(?![\?\.\!])/);\b 告诉它在单词边界上拆分,漂亮的部分是负前瞻。
2021-05-05 15:28:04
正则表达式是错误的。如果我输入:“短语 1。短语 2。短语 3”,“短语 3”被丢弃。
2021-05-08 15:28:04
这是一个变体,当最后一句话结束时没有标点符号也有效: var result = str.match(/([^\.!\?]+[\.!\?]+)|([^\.!\?]+$)/g);
2021-05-12 15:28:04

以下是 Larry 的答案的一个小补充,它也将匹配附加句:

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

应用于:

text = "If he's restin', I'll wake him up! (Shouts at the cage.) 
'Ello, Mister Polly Parrot! (Owner hits the cage.) There, he moved!!!"

给:

["If he's restin', I'll wake him up!", " (Shouts at the cage.)", 
" 'Ello, Mister Polly Parrot!", " (Owner hits the cage.)", " There, he moved!!!"]
您错过了+标点符号后的字符类[.!?],因此它不会捕获“他移动”后的三个感叹号。
2021-05-09 15:28:04

试试这个:-

sentences = text.split(/[\\.!\?]/);

? 是正则表达式中的特殊字符,因此需要进行转义。

对不起,我想念你的问题 - 如果你想保留分隔符,那么你需要使用matchnot splitsee this question

只是一个小说明:?不需要在字符类(方括号)内转义特殊字符
2021-04-30 15:28:04

mircealungu 的回答略有改进:

string.match(/[^.?!]+[.!?]+[\])'"`’”]*/g);
  • 开头不需要左括号。
  • 标点符号,如'...''!!!''!?'等包括内部的句子。
  • 包括任意数量的方括号和右括号。[编辑:添加了不同的右引号]
是否...?支持?
2021-05-10 15:28:04

在这里改进 Mia 的答案是一个版本,其中还包括没有标点符号的结尾句子:

string.match(/[^.?!]+[.!?]+[\])'"`’”]*|.+/g)