在javascript中将字符串拆分为句子

目前我正在开发一个将长列拆分为短列的应用程序。为此,我将整个文本拆分为单词,但此时我的正则表达式也将数字拆分

我所做的是:

str=“这是一个长字符串,包含一些数字[125.000,55和140.000]和一个结尾。这是另一个句子。”;
句子=str.replace(/\.+/g,“.|’)。replace(/\?/g,“?|’)。replace(/\!/g,“!|’)。split(“|”);

结果是:

数组[
“这是一个带有一些数字[125]的长字符串。”,
“000、55及140。”,
“000]和结束。”,
“这是另一句话。”
]

预期的结果将是:

数组[
“这是一个长字符串,包含一些数字[125.000,140.000]和一个结尾。”,
“这是另一句话”
]

我必须如何更改正则表达式才能实现这一点?我需要注意我可能遇到的一些问题吗?或者搜索”、“?“”!“”就足够了吗

str.replace(/([.?!])\s*(?=[A-Z])/g,“$1””。拆分(“|”)

输出:

[“这是一个长字符串,包含一些数字[125.000,55和140.000]和一个结尾。”,
“这是另一句话。”]

细分:

([.?!])=捕获

\s*=在上一个标记([.?!])之后捕获0个或多个空白字符。这说明了与英语语法匹配的标点符号后面的空格

(?=[A-Z])=只有当下一个字符在A-Z(大写A到大写Z)范围内时,前面的标记才会匹配。大多数英语句子都以大写字母开头。以前的正则表达式都没有考虑到这一点


“替换”操作使用:

“$1”

我们使用了一个“捕获组”([.?!]),捕获其中一个字符,并将其替换为$1(匹配)加上。因此,如果我们捕获了,那么替换将是?|

最后,我们拆分管道|,并得到结果


因此,本质上,我们所说的是:

1) 查找标点符号(其中一个)并捕获它们

2) 标点符号可以选择在后面加空格

3) 在标点符号之后,我希望是大写字母

与前面提供的正则表达式不同,这将正确匹配英语语法

从那里:

4) 我们通过添加管道来替换捕获的标点符号|

5) 我们将管道分割成一组句子

发表评论