javascript - 如何在数字和非数字之间添加空格(日期除外)?

标签 javascript node.js regex split nlp

我正在开发一个 NLP 功能,该功能可以处理带有单位的句子。 (例如“显示我在 2012 年 10 月 10 日之后在 30 公里半径范围内启动的超过 300 克的项目”)

我需要预处理字符串,将“300g”更改为“300 g”,将“30km”更改为“30 km”,以便可以将其视为两个单独的值/单词。

我的代码位于 Node.js 中。

我的第一个解决方案是:

    str = "Show me my projects above 300g started after the 10/10/2012 in a 30km radius";
    result = str.match(/(\d+|[^\d]+)/g).join(' ');
    result => "Show me my projects above  300 g started after the  10 / 10 / 2012 in a  30 km radius"

我的问题是日期也被分割,我需要它们保持完整才能被检测为日期。

我不想将格式日期与空格匹配并随后删除空格,因为它可能会更改用户输入(用户可能会输入一个数学方程,如果我们删除空格,该数学方程可能会被错误地视为日期。例如“3 * 10 - 10 - 2016 + 42”将变为“3 * 10-10-2016 + 42”)

这有点牵强,但不添加空格似乎比删除我错误添加的空格更安全。

我想做的是将字符串分割成一个数组,其中日期与其余部分分开:

["Show me my projects above 300g started after the ", "10/10/2012", "in a 30km radius"]

然后我会执行 str.match(/(\d+|[^\d]+)/g).join(' ');在非日期的元素上。 不幸的是我找不到一种方法来分割我的字符串。我尝试了以下正则表达式:

str = "Show me my projects above 300g started after the 10/10/2012";
result = str.match(/(\d{1,2}[/-]\d{1,2}[/-]\d{2,4})|([^\d{1,2}[/-]\d{1,2}[/-]\d{2,4}])/g);

但是语法不正确(如下所示: https://regexr.com/3s9m8 ) 我不知道如何匹配不是日期的部分,因为 [^...] 不适用于复杂的语句。

有没有办法做到这一点正则表达式,或者我需要找到一种不同的方式来做到这一点?

提前致谢, 蒂博。

最佳答案

有几个选项可以解决这个问题。您可以给出要拆分的后缀列表,或者您可以确保它拆分字母,仅此而已。

/(\d+)(g|kg|m|km)/g 将是后缀列表的开头

/(\d+)([A-Z])/ig 将基于拆分字母

然后我建议使用简单的替换函数进行预处理。

const string = "Show me my projects above 300g started after the 10/10/2012 in a 30km radius";
console.log(string.replace(/(\d+)([A-Z])/ig, "$1 $2"));

您还可以使用正向前瞻来稍微简化替换函数。

const string = "Show me my projects above 300g started after the 10/10/2012 in a 30km radius";
console.log(string.replace(/(\d+)(?=[A-Z])/ig, "$1 "));

关于javascript - 如何在数字和非数字之间添加空格(日期除外)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51291071/

相关文章:

javascript - 时刻: format using other locale without changing global moment locale

javascript - 使用 jQuery 基于 data-attr 过滤 DOM 中的元素

javascript - 删除 URL 以获取 YouTube ID

javascript - Lodash Js 使用数组和对象创建树结构

javascript - 如何将数据推送到 MongoDB 中的现有文档中?

php - 正则表达式从字符串 PHP 中删除年份

javascript - 正则表达式匹配变量

javascript - 我可以反过来从对象创建可调用函数吗?

java - 使用 Tomcat 或 Node.js 的 RESTful API?

javascript - 时间戳字符串的正则表达式