我想在一个组的第一个大写字母上分割一个字符串。
例如,FooBARBaz应该变成Foo BAR Baz。
我想出了:
str.replace(/[A-Z][a-z]+/g, ' $&')
.replace(/[A-Z]+/g, ' $&')
.replace(/\s+/g, ' ')
.trim();有人能提出一个更清洁的解决方案吗?
发布于 2022-11-16 13:12:03
像/([][]+)/g这样的简单正则表达式已经实现了.技巧是 https://javascript.info/regexp-groups ,它在与 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split#description 方法一起使用时会被保存下来。因此,您只需要使用一个组模式(一个大写字母后面至少有一个小写字母),并免费获得其余的(一个有效的所有大写字母组)。另外,由于拆分数组还包含空字符串值,因此需要运行额外的filter任务。
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; }
发布于 2022-11-16 14:29:41
您可以通过在replacer方法中使用这个String.replace()函数来实现这一点。
现场演示
const str = 'FooBARBaz';
function replacer() {
return ' ' + arguments[0] + ' ';
}
console.log(str.replace(/[A-Z][a-z]+/g, replacer).trim());
发布于 2022-11-16 10:55:55
您可以尝试匹配上面,然后是上面或上面+而不是上面:
m = 'FooBARBazAB'.match(/([A-Z](?=[A-Z]|$))+|[A-Z][^A-Z]*/g)
console.log(m)
但不确定这是如何“更清洁”。
https://stackoverflow.com/questions/74459067
复制相似问题