将正则表达式替换对转换为单个替换

Convert pair of regex replacements with single replacement

提问人:Simon Brahan 提问时间:11/16/2022 最后编辑:Peter SeligerSimon Brahan 更新时间:12/1/2022 访问量:68

问:

我想在组中的第一个大写字母上拆分一个字符串。

例如,应变为 .FooBARBazFoo BAR Baz

我想出了:

str.replace(/[A-Z][a-z]+/g, ' $&')
    .replace(/[A-Z]+/g, ' $&')
    .replace(/\s+/g, ' ')
    .trim();

谁能建议一个更清洁的解决方案?

JavaScript 正则表达式 替换 拆分 匹配

评论


答:

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());