这可能超出了您的要求,但希望这个答案能帮助任何试图将(几乎)任何字符串转换为 kebab case 的人:
const convertStringToKebebCase = str => str && str
.match(/[0-9]{1,}(?=\b)|[A-Z]{2,}(?=[A-Z][a-z]+|[0-9]|\b|_)|[A-Z]?[a-z]+|[A-Z]|[0-9]+/g)
.map(x => x.toLowerCase())
.join('-')
以下是上述函数的测试,这样您就可以了解它的行为(我将函数重命名为toKebeb
,只是为了更容易阅读):
expect(toKebeb('path')).toEqual('path')
expect(toKebeb('PATH')).toEqual('path')
expect(toKebeb('path route')).toEqual('path-route')
expect(toKebeb('path route 0')).toEqual('path-route-0')
expect(toKebeb('123 path 4 route 567')).toEqual('123-path-4-route-567')
expect(toKebeb('path-route')).toEqual('path-route')
expect(toKebeb('PATH-ROUTE')).toEqual('path-route')
expect(toKebeb('path-route0')).toEqual('path-route-0')
expect(toKebeb('path-route-0')).toEqual('path-route-0')
expect(toKebeb('123-path-4-route-567')).toEqual('123-path-4-route-567')
expect(toKebeb('123-path-4-route-567')).toEqual('123-path-4-route-567')
expect(toKebeb('path_route')).toEqual('path-route')
expect(toKebeb('PATH_ROUTE')).toEqual('path-route')
expect(toKebeb('path_route0')).toEqual('path-route-0')
expect(toKebeb('path_route_0')).toEqual('path-route-0')
expect(toKebeb('123_path_4_route_567')).toEqual('123-path-4-route-567')
expect(toKebeb('123_path_4_route_567')).toEqual('123-path-4-route-567')
expect(toKebeb('pathRoute')).toEqual('path-route')
expect(toKebeb('pathROUTE')).toEqual('path-route')
expect(toKebeb('pathRoute0')).toEqual('path-route-0')
expect(toKebeb('pathROUTE0')).toEqual('path-route-0')
expect(toKebeb('123path4Route567')).toEqual('123-path-4-route-567')
expect(toKebeb('123path4ROUTE567')).toEqual('123-path-4-route-567')
expect(toKebeb('pathRouteA')).toEqual('path-route-a')
expect(toKebeb('pathRouteABC')).toEqual('path-route-abc')
expect(toKebeb('pathIsARoute')).toEqual('path-is-a-route')
expect(toKebeb('path-route0')).toEqual('path-route-0')
expect(toKebeb('path-route123')).toEqual('path-route-123')
expect(toKebeb('path1route')).toEqual('path-1-route')
expect(toKebeb('path123route')).toEqual('path-123-route')
expect(toKebeb('123pathRoute')).toEqual('123-path-route')
expect(toKebeb('123PATHRoute')).toEqual('123-path-route')
expect(toKebeb('123pathROUTE')).toEqual('123-path-route')
我提到这个函数可以转换几乎任何字符串,这是因为处理数字的方式可能因每个用例而异。例如,期望3dPrinter
返回3d-printer
是完全合理的。可以调整正则表达式以支持此功能,但会引发其他问题,例如如何处理3dPrinter12
、my3dPrinter
或se7en
(即哪些数字-字符串顺序组合受到尊重)。支持这些规则将大大增加所需的测试数量,并且总会有例外。
为了支持3dPrinter
示例,您可以在正则表达式的开头(在“/”之后)添加[0-9]{1,}[a-z]{1,}(?=[A-Z]+)|
,但这会破坏一些早期的规则。
要了解此正则表达式的工作原理,请查看regexr上的模式。