提问人:Simon Brahan 提问时间:11/16/2022 最后编辑:Peter SeligerSimon Brahan 更新时间:12/1/2022 访问量:68
将正则表达式替换对转换为单个替换
Convert pair of regex replacements with single replacement
问:
我想在组中的第一个大写字母上拆分一个字符串。
例如,应变为 .FooBARBaz
Foo BAR Baz
我想出了:
str.replace(/[A-Z][a-z]+/g, ' $&')
.replace(/[A-Z]+/g, ' $&')
.replace(/\s+/g, ' ')
.trim();
谁能建议一个更清洁的解决方案?
答:
2赞
gog
11/16/2022
#1
您可以尝试匹配上部,然后是上部或上部 + 不是上部:
m = 'FooBARBazAB'.match(/([A-Z](?=[A-Z]|$))+|[A-Z][^A-Z]*/g)
console.log(m)
不确定这如何“更干净”。
4赞
Peter Seliger
11/16/2022
#2
一个简单的正则表达式,如 /([A-Z][a-z]+)/g
已经做到了......诀窍是捕获组,当与拆分
方法一起使用时,捕获组会被保留。因此,只需要选择一个组模式(一个大写字母,后跟至少一个小写字母),就可以免费获得其余的(一个有效的全大写字母组)。
此外,由于拆分数组还包含空字符串值,因此需要运行额外的筛选
任务。
console.log(
'just split ...\n',
'"FooBARBazBizBuzBOOOOZBozzzBarFOOBARBazbizBUZBoooozBOZZZBar" =>',
'FooBARBazBizBuzBOOOOZBozzzBarFOOBARBazbizBUZBoooozBOZZZBar'
.split(/([A-Z][a-z]+)/g)
);
console.log(
'split and filter ...\n',
'"FooBARBazBizBuzBOOOOZBozzzBarFOOBARBazbizBUZBoooozBOZZZBar" =>',
'FooBARBazBizBuzBOOOOZBozzzBarFOOBARBazbizBUZBoooozBOZZZBar'
.split(/([A-Z][a-z]+)/g)
.filter(val => val !== '')
);
console.log(
'split, filter and join ...\n',
'"FooBARBazBizBuzBOOOOZBozzzBarFOOBARBazbizBUZBoooozBOZZZBar" =>\n',
'FooBARBazBizBuzBOOOOZBozzzBarFOOBARBazbizBUZBoooozBOZZZBar'
.split(/([A-Z][a-z]+)/g)
.filter(val => val !== '')
.join(' ')
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
4赞
Rohìt Jíndal
11/16/2022
#3
您可以通过在 String.replace()
方法中使用此函数来实现此目的。replacer
现场演示 :
const str = 'FooBARBaz';
function replacer() {
return ' ' + arguments[0] + ' ';
}
console.log(str.replace(/[A-Z][a-z]+/g, replacer).trim());
评论