我将有以下输入,我计划从中提取单位
(预期输出,例如:g
、l
、kg
、ml
、l
)和数量(如果存在)(最后输入中的 20
)
0,5g
500l
1000kg
20,5ml
20x0,50l (1 l = 1,70 €) zzgl. 3,10€ Pfand
如果是简单的情况,我正在执行以下操作
输入:
500g
console.log("500g".replace(/ *\([^)]*\) */g, "") // remove brackets
.replace(/[0-9]/g, "") // remove number eg. 500
.replace(/\s/g, ""))
输出:g
(作品)输入:
0,5g
console.log("0,5g".replace(/ *\([^)]*\) */g, "") // remove brackets
.replace(/[0-9]/g, "") // remove number eg. 500g
.replace(/\s/g, ""))
输出:,g
(休息)输入:
20x0,50l (1 l = 1,70 €) zzgl. 3,10€ Pfand
console.log("20x0,50l (1 l = 1,70 €) zzgl. 3,10€ Pfand".replace(/ *\([^)]*\) */g, "") // remove brackets
.replace(/[0-9]/g, "") // remove number eg. 500g
.replace(/\s/g, ""))
输出:x,lzzgl.,€Pfand
(休息)
最佳答案
而不是使用 replace
,您可能想使用 match
,这将返回一个匹配对象。
Mozilla Article
正则表达式模式:
对于匹配值和单位:
([\d,\.]+)\s*(g|kg|l|ml)
最后一组可以添加更多单位。例子:
"20x0,50l (1 l = 1,70 €) zzgl. 3,10€ Pfand".match(/([\d,\.]+)\s*(g|kg|l|ml)/)
returns
(3) ...:
0: "0,50l" // full match
1: "0,50" // value
2: "l" // unit
...
仅匹配单位(虽然这有点不必要,但前面的正则表达式同时匹配第 1 组中的值,第 2 组中的单位):(?<=[\d,\.]+)\s*(g|kg|l|ml)
对于匹配数量:([\d,\.]+)(?:x|\*)
例子:"20x0,50l (1 l = 1,70 €) zzgl. 3,10€ Pfand".match(/([\d,\.]+)(?:x|\*)/)
returns
(2) ...:
0: "20x" // full match
1: "20" // quantity
...
编辑:进一步详细说明我的评论
var units = ["g", "kg", "l", "ml"];
var re = new RegExp(`([\\d,\\.]+)\\s*(${units.join("|")})`);
然后使用 re 进行匹配:"20x0,50l (1 l = 1,70 €) zzgl. 3,10€ Pfand".match(re)
工作方式相同,但更易于维护。
关于javascript - 如何使用正则表达式从字符串中提取特定字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65396007/