我正在开发一个 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/