Javascript 从随机字符串中删除非数字字符,但第一次出现的字符除外#

Javascript 从随机字符串中删除非数字字符,但第一次出现的字符除外#,javascript,regex,Javascript,Regex,这个问题看起来微不足道,但事实并非如此。我想使用regexp从字符串中删除所有非数字字符,而不使用第一个字符。您可以使用以下代码段(并在此处编辑magic函数)进行测试: 函数魔术(str){ //示例硬编码实现-删除它并使用适当的regexp 返回str.replace(/#1234a5678b910/,'12345678910'); } //试验 tests={//keys是输入字符串,value是该输入的有效结果 “#1234a5678b910”:“#12345678910”, “12#

这个问题看起来微不足道,但事实并非如此。我想使用regexp从字符串中删除所有非数字字符,而不使用第一个
字符。您可以使用以下代码段(并在此处编辑
magic
函数)进行测试:

函数魔术(str){
//示例硬编码实现-删除它并使用适当的regexp
返回str.replace(/#1234a5678b910/,'12345678910');
}
//试验
tests={//keys是输入字符串,value是该输入的有效结果
“#1234a5678b910”:“#12345678910”,
“12#34a5678b910”:“12#345678910”,
“1234a56#78b910”:“123456#78910”,
“1234a5678b91#0”:“1234567891#0”,
“1234a5678b91#0”:“1234567891#0”,
“98#765a4321#039c”:“98#7654321039”,
“98a765#4321#039c”:“98765#4321039”,
“98a765b4321###39”:“987654321#39”,
}

Object.keys(tests).map(k=>console.log(`${k}Test:${(''+(magic(k)==tests[k])).padEnd(5',).toUpperCase()}(结果是${magic(k)}-应该是${tests[k]})`)
使用此正则表达式替换字符串
([a-zA-Z])|(?使用此正则表达式替换字符串
([a-zA-Z])|(?可变长度lookbehind仅在某些JavaScript引擎(EMCA2018)中工作。有关lookbehind断言,请参阅浏览器兼容性

正则表达式方法 对于支持lookbehinds的引擎,可以使用以下正则表达式:

(?<!^[^#]*(?=#))\D+

可变长度lookbehind仅在某些JavaScript引擎中工作(EMCA2018)。有关lookbehind断言,请参阅浏览器兼容性

正则表达式方法 对于支持lookbehinds的引擎,可以使用以下正则表达式:

(?<!^[^#]*(?=#))\D+

非常简单-匹配包含第一个
#
(如果有)的部分,只替换第二组中的非数字。然后,将它们粘在一起

函数魔术(str){
设rx=/^([^\n]*\\)(.*)/;
让字符串=str.replace(rx,函数(m,g1,g2){
if(g1.endsWith(“#”){
第1部分=g1。替换(/\D+/g“”)+“#”;
}否则{
第1部分=g1。替换(/\D+/g,“”);
}
返回部件1+g2。替换(/\D+/g,“”);
});
返回字符串;
}
//试验
tests={//keys是输入字符串,value是该输入的有效结果
“#1234a5678b910”:“#12345678910”,
“12#34a5678b910”:“12#345678910”,
“1234a56#78b910”:“123456#78910”,
“1234a5678b91#0”:“1234567891#0”,
“1234a5678b91#0”:“1234567891#0”,
“98#765a4321#039c”:“98#7654321039”,
“98a765#4321#039c”:“98765#4321039”,
“98a765b4321###39”:“987654321#39”,
}

Object.keys(tests).map(k=>console.log(`k}Test:${(''+(magic(k)==tests[k])).padEnd(5',).toUpperCase()}(结果是${magic(k)}-应该是${tests[k]});
非常简单-匹配包括第一组的部分
(如果有)并替换第二组中的非数字。然后,将它们粘在一起

函数魔术(str){
设rx=/^([^\n]*\\)(.*)/;
让字符串=str.replace(rx,函数(m,g1,g2){
if(g1.endsWith(“#”){
第1部分=g1。替换(/\D+/g“”)+“#”;
}否则{
第1部分=g1。替换(/\D+/g,“”);
}
返回部件1+g2。替换(/\D+/g,“”);
});
返回字符串;
}
//试验
tests={//keys是输入字符串,value是该输入的有效结果
“#1234a5678b910”:“#12345678910”,
“12#34a5678b910”:“12#345678910”,
“1234a56#78b910”:“123456#78910”,
“1234a5678b91#0”:“1234567891#0”,
“1234a5678b91#0”:“1234567891#0”,
“98#765a4321#039c”:“98#7654321039”,
“98a765#4321#039c”:“98765#4321039”,
“98a765b4321###39”:“987654321#39”,
}

Object.keys(tests).map(k=>console.log(`k}Test:${(''+(magic(k)==tests[k])).padEnd(5',).toUpperCase()}(结果是${magic(k)}-应该是${tests[k]}');
str replace(/[^0-9#]]。(试试这个:'.'fklsjadklfsklfsaklf4f4s5daf64s564fs4fsa655fdasf'.[]@Toto“重复”问题启发我创建了这个问题——但是——正如作者在评论中所澄清的那样——这个问题不是重复的——在这个问题中,OP只想扮演一个角色——在这个问题中,可以在任何地方——一个完全改变的解决方案(和难度等级)
str.replace(/[^0-9)]|(?试试这个:“#fklsjadklfsaklf4f4s5daf64s564fsa65fd46asf”。替换(/([#]?)([^0-9])+/g,$1”)@Toto“重复”问题启发我创建了这个问题——但是——正如作者在评论中澄清的那样——这个问题不是重复的——在这个问题中,OP只想扮演一个角色——在这个问题中,可以在任何地方——这是一个完全改变的解决方案(和难度级别),我使用--
str.replace(/([a-zA-Z])|(?我使用-
str.replace(/([a-zA-Z]))|(?几乎有效,请参见我的第二种方法(您还需要在第一个
#
)之前替换任何非数字字符)@ctwheels:您是对的,添加了一些编程逻辑。我们也将研究您的。您可以将正则表达式更改为
^([^\n]*)(#)(.*)
,并将语句返回到
g1.replace(/\D+/g,”)+(g2 | | |“)+g3.替换(/\D+/g,”)
并删除
,如果
语句几乎可以工作,请参阅我的第二种方法(您还需要替换第一个
之前的任何非数字字符)@ctwheels:您是对的,添加了一些编程逻辑。我们也将查看您的。您可以将regex更改为
^([^\n]*)()?(.*)
并将语句返回到
g1。替换(/\D+/g',)+(g2 | |?)+g3。替换(/\D+/g,”);
并删除
if
语句