【问题标题】:Match numbers in a String only once仅匹配字符串中的数字一次
【发布时间】:2017-07-03 08:44:51
【问题描述】:

我有这个代码,但现在我只尝试匹配一次数字。

var text = "91308543 v1_Printer 91308543 v2 91503362 v1_Printer";
var regex = /9\d{7}/g;

var result = text.match(regex);

var pos0 = result[0];
var pos1 = result[1];
var pos2 = result[2];

return(pos0 + " " + pos1 + " " + pos2);

结果是:91308543 91308543 91503362

我要的结果:91308543 91503362

可以在我的正则表达式中添加一些东西,这样它就不会显示重复的值吗? 我不喜欢使用数组,因为在这种情况下我需要使用原生数组...

我还有第二个问题,是否可以自动创建变量“pos0”、“pos1”...?

谢谢!

【问题讨论】:

  • 可以,但是最好过滤结果数组。
  • 也许(9\d{7})(?!.*\1)
  • 请注意"9876511392222332" 将被分成两场比赛。

标签: javascript regex match


【解决方案1】:

您正在寻找的正则表达式是

(9\d{7})\b(?!.*\1\b)

它使用negative lookahead。见demo

第二点可以通过eval实现:

var result = text.match(regex);
for (var i = 0; i < result.length; i++){
  eval('var pos' + i + ' = "' + result[i] + '"');
}

但这对返回语句没有帮助。

你应该只使用:

return(result.join(" "));

【讨论】:

  • 完美运行!谢谢!
【解决方案2】:

您可以在匹配后filter 剔除重复项,并使用destructuring assingment 分配给各个变量:

let text = "91308543 v1_Printer 91308543 v2 91503362 v1_Printer";
let regex = /9\d{7}/g;
let [pos0, pos1, pos2] = text.match(regex).filter((v, i, a) => a.indexOf(v) === i);

console.log(pos0);
console.log(pos1);
console.log(pos2);

【讨论】:

    【解决方案3】:

    试试这个模式(9\d{7})(?!.*\1)负前瞻。​​它不允许重复

    Demo regex

    For more reference

    var text = "91308543 v1_Printer 91308543 v2 91503362 v1_Printer";
    var regex = /(9\d{7})(?!.*\1)/g;
    
    var result = text.match(regex);
    
    console.log(result)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2018-03-28
      • 2017-03-21
      相关资源
      最近更新 更多