【问题标题】:Altered kebab case Regex改变烤肉串案例正则表达式
【发布时间】:2021-04-20 10:56:06
【问题描述】:

我正在使用以下toKebabCase() 函数:

function toKebabCase(key) {
  return key.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
    .map((word) => word.toLowerCase())
    .join('-');
}

console.log(toKebabCase('namespaceGray100Light'));

它的行为并不像我想要的那样完全。现在,如果我将'namespaceGray100Light' 作为参数传递,该函数将返回'namespace-gray100-light'。这个正则表达式需要如何修改才能返回'namespace-gray-100-light'

为了澄清,我希望在数字跟在字母字符之后引入连字符,而不仅仅是在数字在字母字符之前。

TY.

【问题讨论】:

    标签: javascript regex string


    【解决方案1】:

    您需要从模式中删除[0-9]*

    function toKebabCase(key) {
      return key.match(/[A-Z]{2,}(?=[A-Z][a-z]+|\b)|[A-Z]?[a-z]+|[A-Z]|[0-9]+/g)
        .map((word) => word.toLowerCase())
        .join('-');
    }
    console.log(toKebabCase('namespaceGray100Light'));

    请参阅regex demo

    请注意,您的正则表达式有两次出现 [0-9]*

    • (?=[A-Z][a-z]+[0-9]*|\b) - 这里,[0-9]* 是多余的,因为它可以匹配零个字符、一个空字符串,并且位于前瞻替代方案的末尾
    • [A-Z]?[a-z]+[0-9]* - 在这里,[0-9]* 使用字母词后面的数字,但这正是您需要在其间添加 - 的地方。数字将与 [0-9]+ 最后一个选项匹配。

    【讨论】:

      【解决方案2】:

      只需为这种情况添加replace

      function toKebabCase(key) {
        return key.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
          .map((word) => word.toLowerCase())
          .join('-')
          .replace(/([^\d])(\d)/g, "$1-$2");
      }
      
      console.log(toKebabCase('namespaceGray100Light'));

      无需让已经很复杂的正则表达式变得更复杂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-17
        • 2013-10-04
        • 1970-01-01
        • 2014-03-08
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 2013-08-16
        相关资源
        最近更新 更多