【问题标题】:JS split text into sentencesJS 将文本拆分成句子
【发布时间】:2017-04-18 21:25:23
【问题描述】:

我想接收大量文本(例如一本书的章节),并创建一个句子数组。

我当前的代码是:

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

这仅适用于文本以 [. ! ?]。如果最后一句话末尾没有标点符号,则丢失。

如何将我的文本拆分成句子,让最后一个句子没有标点符号?

【问题讨论】:

  • 最后一句有换行吗?
  • 添加 \n 即换行
  • \n 仅在文本中没有其他换行符时才有效,这听起来不太可能。
  • 你可以举个例子,你会得到更多相关的答案
  • 如果你的句子中有缩写怎么办?

标签: javascript regex


【解决方案1】:

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

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

【讨论】:

  • 根据他原来的正则表达式,他似乎想包含句尾标点符号。
  • 我知道,为什么你认为我的正则表达式不这样做?
  • 因为我运行了 sn-p。
【解决方案2】:

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

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

可以胜任。

(如果不行,能不能提供几句你不能匹配的句子?)

【讨论】:

  • 我几乎得到了这个,但最后还有字符串结尾$text.match( /[^\.!\?]+[\.!\?]+|[^\.!\?]+$/g );
【解决方案3】:

根据您在结果中是否需要句子的标点符号,您可以只使用“split”

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

【讨论】:

  • 我试过split,很好,不会丢失任何东西,但我确实需要标点符号
【解决方案4】:

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

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

或者您可能希望在末尾允许空白字符:

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

【讨论】:

  • 正确!谢谢,但实际上您需要在字符串 $ 的结尾之前允许字符。所以我做了/[^\.!\?]+([\.!\?]+["']?|$)/g,但我认为它也可能是/[^\.!\?]+[\.!\?]+["']?|.+$/g
  • @Mirror318 /[^\.!\?]+[\.!\?]+["']?|.+$/g 效果很好!
  • @Mirror318 你是对的,我的仍然缺少我认为的最后一句话。您的任何建议都应该有效。我改变了答案。
猜你喜欢
  • 2011-11-03
  • 2019-08-27
  • 1970-01-01
  • 2013-04-28
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多