NJS(JavaScript)中用于将驼峰命名单词按破折号分割的正则表达式

3
我已经成功创建了一个用于在Perl中分割驼峰词的正则表达式。然而,由于JavaScript不支持正向后查,所以我发现创建一个能够执行相同操作的正则表达式有些困难。
以下是输入和期望输出的格式列表:
1. InstallAndSetup -> install-and-setup 2. DeployingABCDefGhijk -> deploying-abc-def-ghijk(假设abc是一个常用的名词) 3. OpenIDConnect -> openid-connect 4. OAuth2Scopes -> oauth2-scopes 5. APISecurity -> api-security
我使用的Perl脚本如下:
 my $r = shift;
 my $uri = $r->uri;
 @uri = split /(?<=[a-z])(?=[A-Z])(?!ID)(?!^Open$)|(?<=ABC)|(?<=API)(?=[A-Z])|(?=Connect)/,$uri;
 $uri = join ("-", @uri);
 $uri = lc($uri);
 return  $uri;

我正在努力将此相同的正则表达式 ((?<=[a-z])(?=[A-Z])(?!ID)(?!^Open$)|(?<=ABC)|(?<=API)(?=[A-Z])|(?=Connect)) 转换为在Javascript中使用。 任何帮助将不胜感激。


很多JS环境已经支持正则表达式的后行断言。 - Wiktor Stribiżew
1
然而,它并不是JS的正式部分(只是一个草案),并且27-46%的网络用户(取决于你问谁)使用不支持它的浏览器。 - ikegami
1个回答

1

我不确定正则表达式是否是最好的选择,因为你有一些固定的单词和任意规则的混合,但我认为通过一点先行断言:

(OAuth2|OpenID|[A-Z]+$|[A-Z]+(?=[A-Z][^A-Z])|[A-Z][^A-Z]+)

这个程序以OAuth2和OpenID作为特殊情况,否则任何两个或两个以上大写字母和一个大写字母后跟非大写字母的序列都可以。

不同之处在于,这个程序会将你想要的部分捕获到一个组(组1)中,并且你可以遍历匹配项。

如果你只想转换文本,你可以使用以下方法:

uri.replace(/(OAuth2|OpenID|[A-Z]+$|[A-Z]+(?=[A-Z][^A-Z])|[A-Z][^A-Z]+)/, function(v) { return "-"+v.toLowerCase(); });
uri = uri.substring(1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接