首页 > 解决方案 > 用数字和字符分隔字符串

问题描述

我正在尝试格式化字符串以生成正确格式的新字符串:

我有以下字符串(左)应该格式化为匹配(右):

  [ 'xx9999', 'XX-99-99' ],
  [ '9999xx', '99-99-XX' ],
  [ '99xx99', '99-XX-99' ],
  [ 'xx99xx', 'XX-99-XX' ],
  [ 'xxxx99', 'XX-XX-99' ],
  [ '99xxxx', '99-XX-XX' ],
  [ '99xxx9', '99-XXX-9' ],
  [ '9xxx99', '9-XXX-99' ],
  [ 'xx999x', 'XX-999-X' ],
  [ 'x999xx', 'X-999-XX' ],
  [ 'xxx99x', 'XXX-99-X' ],
  [ 'x99xxx', 'X-99-XXX' ],
  [ '9xx999', '9-XX-999' ],
  [ '999xx9', '999-XX-9' ]

我尝试了以下方法,但无法使其正常工作:

const formatLp = (userInput) => {
  if (userInput) {
     return userInput.toUpperCase().match(/[a-z]+|[^a-z]+/gi).join('-');
  }
}

这适用于其中一些,例如99xxx9但不适用于其他人,例如xx9999

任何帮助,将不胜感激。

标签: javascript

解决方案


使用.replace两次 - 一次-在 4 个重复数字/非数字之间插入 a,一次-在数字和字母字符之间插入 a:

const arr = [
  [ 'xx9999', 'XX-99-99' ],
  [ '9999xx', '99-99-XX' ],
  [ '99xx99', '99-XX-99' ],
  [ 'xx99xx', 'XX-99-XX' ],
  [ 'xxxx99', 'XX-XX-99' ],
  [ '99xxxx', '99-XX-XX' ],
  [ '99xxx9', '99-XXX-9' ],
  [ '9xxx99', '9-XXX-99' ],
  [ 'xx999x', 'XX-999-X' ],
  [ 'x999xx', 'X-999-XX' ],
  [ 'xxx99x', 'XXX-99-X' ],
  [ 'x99xxx', 'X-99-XXX' ],
  [ '9xx999', '9-XX-999' ],
  [ '999xx9', '999-XX-9' ]
];
arr.forEach(([str]) => {
  const result = str.toUpperCase()
    .replace(/\d{4}|\D{4}/, substr => `${substr.slice(0, 2)}-${substr.slice(2)}`)
    .replace(/[a-z]{4}|\d(?=[a-z])|[a-z](?=\d)/gi, '$&-');
  console.log(result);
});

您也可以通过匹配然后加入来做到这一点 - 匹配 3 个非数字,或 3 个数字,或 1-2 个非数字,或 1-2 个数字:

const arr = [
  [ 'xx9999', 'XX-99-99' ],
  [ '9999xx', '99-99-XX' ],
  [ '99xx99', '99-XX-99' ],
  [ 'xx99xx', 'XX-99-XX' ],
  [ 'xxxx99', 'XX-XX-99' ],
  [ '99xxxx', '99-XX-XX' ],
  [ '99xxx9', '99-XXX-9' ],
  [ '9xxx99', '9-XXX-99' ],
  [ 'xx999x', 'XX-999-X' ],
  [ 'x999xx', 'X-999-XX' ],
  [ 'xxx99x', 'XXX-99-X' ],
  [ 'x99xxx', 'X-99-XXX' ],
  [ '9xx999', '9-XX-999' ],
  [ '999xx9', '999-XX-9' ]
];
arr.forEach(([str]) => {
  const result = str.toUpperCase()
    .match(/[a-z]{3}|\d{3}|[a-z]{1,2}|\d{1,2}/gi)
    .join('-');
  console.log(result);
});


推荐阅读