正则表达式替换多个字符串数组 javascript

regex replace for multiple string array javascript

我有一个字符串数组和字符串中任意位置的 #number-number 等模式。

要求:

我卡住了,怎么办 JavaScript。这是我使用的代码:

let arrstr=["#12-1676","#02-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988", "380100 6-764","380100 #6-764","380100 #06-764"]

for(let st of arrstr)
 console.log(st.replace(/#?(\d)?(\d-)/g ,replacer))
 
 function replacer(match, p1, p2, offset, string){
  let replaceSubString = p1 || "0";
  replaceSubString += p2;
  return replaceSubString;
 }
let list_of_numbers =["#1-7878", "#162-7878", "#12-1676","#02-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988"]

const solution = () => {
    let result = ''
    for (let number of list_of_numbers) {
        let nums = number.split('-')
        if (nums[0][0] == '#' && nums[0].length > 2) {
            result = `${nums[0].slice(1, number.length-1)}-${nums[1]}`
            console.log(result)
        } else if (nums[0][0] == '#' && nums[0].length == 2) {
            result = `${nums[0][0] = '0'}${nums[0][1]}-${nums[1]}`
            console.log(result)
        } else {
            console.log(number)
        }
    }
}

我认为一个简单的检查是你应该用匹配函数做什么。

let arrstr=["#12-1676","#0-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988"];
const regex = /#\d-/g;
for(i in arrstr){
    var found = arrstr[i].match(regex);
    if(found){
      arrstr[i]=arrstr[i].replace("#","0")
    }else{
      arrstr[i]=arrstr[i].replace("#","")
    }
}
console.log(arrstr);

或者如果您真的想坚持自己的方式。

let arrstr=["#12-1676","#02-8989898","#6-98908098","12-232","02-898988","676-98098","2-898988"]

for(let st of arrstr)
 console.log(st.replace(/#(\d)?(\d-)/g ,replacer))
 
 function replacer(match, p1, p2, offset, string){
  let replaceSubString = p1 || "0";
  replaceSubString += p2;
  return replaceSubString;
 }

删除“?”来自正则表达式,所以它不是#?但只是#

使用 unary operator,这里有两个衬里 replacer 函数。

const testValues = ["#162-7878", "#12-4598866", "#1-7878", "1-7878"];
const re = /#?(\d+?)-(\d+)/;

for(const str of testValues) {
  console.log(str.replace(re, replacer));
}

function replacer(match, p1, p2) {
  p1 = +p1 < 10 ? `0${p1}` : p1;
  return `${p1}-${p2}`; 
}

我建议在字符串的开头选择匹配 #,然后在 - 之前捕获一个或多个数字 + 一个数字,以便稍后用前导零填充这些数字并省略前导 # 在结果中:

st.replace(/#?\b(\d+)(?=-\d)/g, (_,) => .padStart(2,"0"))

查看 JavaScript 演示:

let arrstr=["#12-1676","#02-8989898","#676-98908098","12-232","02-898988","676-98098","2-898988", "380100 6-764","380100 #6-764","380100 #06-764"]

for(let st of arrstr)
 console.log(st,'=>', st.replace(/#?\b(\d+)(?=-\d)/g, (_,) => .padStart(2,"0") ))

/#?\b(\d+)(?=-\d)/g 正则表达式匹配所有出现的

  • #? - 一个可选的 # 字符
  • \b - 单词边界
  • (\d+) - 捕获第 1 组:一个或多个数字...
  • (?=-\d) - 后面必须跟一个 - 和一个数字(这是一个积极的前瞻,只检查它的模式是否与当前位置的右侧立即匹配,而不实际消耗匹配的文本)。