【问题标题】:regex replace for multiple string array javascript正则表达式替换多个字符串数组javascript
【发布时间】:2022-01-14 02:54:32
【问题描述】:

我有一个字符串数组,以及字符串中任意位置的 #number-number 之类的模式。

要求

  • 如果 # 和前面的单个数字由连字符替换,则替换 # 并添加 0。例如,#162-7878 => 162-7878#12-4598866 => 12-4598866

  • 如果 # 和前面的两位或多位数字是连字符,则替换删除 #。例如,#1-7878 => 01-7878

  • 如果连字符前面没有# 和个位数,则添加0。例如,1-7878 => 01-7878

我在 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;
 }

【问题讨论】:

  • 去掉#?并将其更改为#,一切顺利!
  • 请编辑您的问题
  • @SolomonPByer 感谢您的回复,更新了问题
  • .replace(/^#?(\d+)(?=-\d)/, (_,$1) => $1.padStart(2,"0")) seems working well 够了。

标签: javascript arrays regex string replace


【解决方案1】:

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

st.replace(/#?\b(\d+)(?=-\d)/g, (_,$1) => $1.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, (_,$1) => $1.padStart(2,"0") ))

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

  • #? - 一个可选的 # 字符
  • \b - 字边界
  • (\d+) - 捕获组 1:一位或多位数字...
  • (?=-\d) - 后面必须跟 - 和一个数字(这是一个正向预测,只检查其模式是否与当前位置的右侧直接匹配,而不实际使用匹配的文本)。

【讨论】:

  • 感谢您的帮助,#6-764 78798 应该是 06-764 78798 但返回相同
  • @sen 返回#6-764 78798 => 06-764 78798
  • 道歉 78798 #6-764 应该是 78798 06-764 但返回相同
  • 以上代码不适用于380100 6-764, 380100 #6-764, 380100 #06-764,因为这些代码应该返回380100 06-764
  • @sen 这是我的荣幸。我只错过了“字符串内的任何地方”位。如果单词边界有问题,请替换为(?<!\d)。或者让我知道。
【解决方案2】:

使用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}`; 
}

【讨论】:

  • 感谢您的帮助,但当我通过 1-7878 时应该是 01-7878
  • @sen 调整后的答案。
  • 感谢再次回复,但它不适用于 #02-7878 更改为 002-7878 而不是 02-7878
  • @sen 您在问题中发布了一些代码:它是否适合您?如果是,您需要什么?
  • 感谢您的回复,this scenario -&gt;string like "2-7878" to "02-7878" works 当我尝试 #02-7878 它不起作用时,它显示 002-7878 而不是 02-7878 。
【解决方案3】:
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)
        }
    }
}

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案4】:

我认为你应该对 match 函数做一个简单的检查。

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;
 }

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

【讨论】:

  • 谢谢,但是当我通过 2-898988 时应该是 02-898988
  • 那么您的代码有什么问题?
  • 可以,但是如果连字符前面没有#和个位数,只加0,不工作,更新问题,抱歉错过,感谢帮助
猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多