JS Regex只能用一个逗号匹配数字



我需要找出所有只有一个逗号的数字。我有一个正则表达式,

[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);

最新更新