【问题标题】:Javascript RegExp for splitting text into sentences and keeping the delimiter用于将文本拆分为句子并保留分隔符的 Javascript RegExp
【发布时间】:2012-07-30 11:39:39
【问题描述】:

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

到现在为止

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

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

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

【问题讨论】:

  • ? 也是 RegExp 中的一个特殊字符,所以你需要转义它
  • .? 这样的元字符在字符类中失去了它们的特殊含义。匹配点 (.)、感叹号 (!) 或问号 (?) 的正确方法是 [.!?]

标签: javascript regex sentence


【解决方案1】:

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

试试这个。

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);

【讨论】:

  • 您可以使用拆分:text.split(/\b(?![\?\.\!])/); \b 告诉它在单词边界上拆分,漂亮的部分是负前瞻。
  • 正则表达式错误。如果我输入:“Phrase 1. Phrase 2. Phrase 3”,“Phrase 3”就会被丢弃。
  • 这是一个在最后一句没有标点符号结束时也适用的变体:var result = str.match(/([^\.!\?]+[\.!\?]+)|([^\.!\?]+$)/g);
  • 哇,这东西也能捕捉到省略号。 var str = "I like turtles... Do you? Awesome! hahaha. lol!!! What's going on????";
  • 当有浮点数时会中断:Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum"
【解决方案2】:

以下是对拉里答案的一个小补充,它也将匹配副句:

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!!!"]

【讨论】:

  • 你错过了标点符号类[.!?]后面的+,所以它不会捕捉到“他动了”后面的三个感叹号。
【解决方案3】:

试试这个:-

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

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

抱歉,我错过了阅读您的问题 - 如果您想保留分隔符,那么您需要使用 match 而不是 split 参见 this question

【讨论】:

  • 只是一个小提示:像? 这样的特殊字符不需要在字符类(方括号)内转义。
【解决方案4】:

对 mircealungu 的回答略有改进:

string.match(/[^.?!]+[.!?]+[\])'"`’”]*/g);
  • 开头不需要左括号。
  • 句中包含'...''!!!''!?'等标点符号。
  • 包括任意数量的方括号和右括号。 [编辑:添加了不同的右引号]

【讨论】:

  • 是否支持...?
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2016-11-26
    • 2022-11-03
    相关资源
    最近更新 更多