使用 JavaScript 计算字符串中的句子

Thi*_*ent 5 javascript regex string count coffeescript

已经有几个类似的问题:

我的情况有点不同。

我需要数数字符串中的句子数。

最接近我需要的答案是:

str.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|")
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是这个 RegEx 假设句子以大写字母开头,但情况并非总是如此。

更具体地说,我将一个句子定义为:

  • 以字母(大写与否)、数字甚至符号(如 $ 或 €)开头。
  • 以标点符号结尾,例如“.”、“?”或“!”。

但是,如果一个句子包含一个数字,而数字本身又包含一个“.”或一个“,”,则该句子应被视为一个句子而不是两个句子。

最后但并非最不重要的一点是,我们可以假设,除了第一句话,一个句子前面都有一个空格。

给定一个随机字符串,我如何计算它包含的 Javascript(或 CoffeeScript)的句子数?

小智 5

解决您的问题的一种正则表达式是:

\w[.?!](\s|$)
Run Code Online (Sandbox Code Playgroud)

各部分如下:

\w - Word character
\[.?!] - Punctuation as specified.
(\s|$) - Whitespace character OR the end of the string.
Run Code Online (Sandbox Code Playgroud)

您可以使用字符类而不是组:

[\s|$]
Run Code Online (Sandbox Code Playgroud)

对于最后一个元素,但这不适用于https://regex101.com/

在以下方面进行了测试:

与流行的看法相反,Lorem Ipsum 不仅仅是随机文本。它源于公元前 45 年的一段古典拉丁文学,已有 2000 多年的历史。弗吉尼亚州汉普登-悉尼学院的拉丁语教授理查德麦克林托克从 Lorem Ipsum 的一篇文章中查找了一个较为晦涩的拉丁词 consectetur,并查阅了古典文学中对该词的引用,发现了无可置疑的来源。Lorem Ipsum 来自西塞罗写于公元前45的“de Finibus Bonorum et Malorum”(善与恶的极端)的 1.10.32 和 1.10.33 节这本书是关于伦理学理论的论文,在文艺复兴时期非常流行Lorem Ipsum 的第一行“Lorem ipsum dolor sat amet..”来自第 1.10 节中的一行。32.

并找到六个句子(在句子末尾加粗,而不是实际匹配)。请注意,如果您出于任何原因依赖不同的分组,则可能会造成问题。

  • 如何在JS中添加这个? (2认同)
  • 使用示例正则表达式,您的最后 2 个句子将计为 1。它与 ').` 不匹配。更正后的正则表达式为 `str.match(/[\w|\)][.?!](\s|$)/g).length` (2认同)