我需要找出所有只有一个逗号的数字。我有一个正则表达式,
[d ,]+
但无论数字中有多少逗号,它都会匹配所有数字。
因此,在本文中
lorem 49 877 989 888,33 ipsum 1,2,3 dfgdfgdf 1,222
它应该只匹配第一个和最后一个数字:
49 877 989 888,33
1,222
而不是这个
1,2,3
您可以使用
b(?<!d,)(?:d{1,3}(?: d{3})*|d+),d+b(?!,d)
请参阅regex演示。
const text = "lorem 49 877 989 888,33 ipsum 1,2,3 dfgdfgdf 1,222";
console.log(text.match(/b(?<!d,)(?:d{1,3}(?: d{3})*|d+),d+b(?!,d)/g));
详细信息:
b
-一个词的边界(?<!d,)
-如果当前位置的左侧有一个数字和一个逗号,则负查找将使匹配失败(?:
-非捕获组的启动:d{1,3}
-一到三位数字(?: d{3})*
-一个空格和三个数字的零次或多次重复(用s
替换空格以匹配任何空白字符)|
-或d+
-任意一个或多个数字
,
-逗号d+
-一个或多个数字b
——一个词的边界(?!,d)
-如果当前位置右侧有一个逗号和一个数字,则匹配失败的负前瞻
如果您不想使用带有lookbacking的正则表达式,以便在旧版/旧版浏览器中使用该模式,请使用一个常见的解决方法:
(d,)?b(?:d{1,3}(?: d{3})*|d+),d+b(?!,d)
并且过滤掉组1不为空的所有匹配。请参阅regex演示#2。
var text = "lorem 49 877 989 888,33 ipsum 1,2,3 dfgdfgdf 1,222";
var regex = /(d,)?b(?:d{1,3}(?: d{3})*|d+),d+b(?!,d)/g;
var results = [], m;
while (m = regex.exec(text)) {
if (m[1] === undefined) results.push(m[0])
}
console.log(results);
我们可以使用具有两种正则表达式模式的方法。第一场比赛:
bd+(?:[ ,]?d+)*b
然后只过滤最多有一个逗号的数字。
示例脚本:
var input = "lorem 49 877 989 888,33 ipsum 1,2,3 dfgdfgdf 1,222";
var nums = input.match(/bd+(?:[ ,]?d+)*b/g)
.filter(x => !x.match(/,.*,/));
console.log(nums);
不能在一行代码中完成,这是我的解决方案:
let input = 'lorem 49 877 989 888,33 ipsum 1,2,3 dfgdfgdf 1,222'
let numbers = []
let words = input.split(/s+/)
words.forEach(function(w)
{
let nums = w.match(/d+(?:[,d]+)?/)
if(nums)
{
let commas = nums[0].match(/,/g)
if(commas)
commas = commas.length
else
commas = 0
if(commas<2)
numbers.push(nums[0])
}
})
console.log(numbers)
输出:
[ '49', '877', '989', '888,33', '1,222' ]
我的两美分使用零宽度查找:
(?<!ds*,?)d+(?:sd+)*,d+(?!,?s*d)
查看在线演示
(?<!ds*,?)
-断言位置前面没有一个带0+空格字符的数字和一个可选逗号d+(?:sd+)*,d+
-匹配1+个数字,非捕获组匹配0+次,允许在匹配逗号和1+个以上数字之前使用空格分隔的数字(?!,?s*d)
-断言位置后面没有可选的逗号、0+空白字符和另一个数字
var s_in = "lorem 49 877 989 888,33 ipsum 1,2,3 dfgdfgdf 1,222";
var s_out = s_in.match(/(?<!ds*,?)d+(?:sd+)*,d+(?!,?s*d)/g);
console.log(s_out);