正则表达式替换多个字符串数组 javascript
regex replace for multiple string array javascript
我有一个字符串数组和字符串中任意位置的 #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;
}
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)
- 后面必须跟一个 -
和一个数字(这是一个积极的前瞻,只检查它的模式是否与当前位置的右侧立即匹配,而不实际消耗匹配的文本)。
我有一个字符串数组和字符串中任意位置的 #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;
}
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)
- 后面必须跟一个-
和一个数字(这是一个积极的前瞻,只检查它的模式是否与当前位置的右侧立即匹配,而不实际消耗匹配的文本)。