【问题标题】: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'));
无需让已经很复杂的正则表达式变得更复杂。