6

我正在尝试为 javascript语句编写一个 SublimeText片段。import我希望格式格式如下:

import MyFooBar from 'my-foo-bar';

我的正则表达式的输入是MyFooBar,输出需要是my-foo-bar。我找到了一个几乎可以在Regex - CamelCase 中使用下划线小写的答案:

搜索

((?<=.)[A-Z][a-zA-Z]*)|((?<=[a-zA-Z])\d+)

用。。。来代替

-$1$2

答案说只是使用 javascript 的.toLowerCase()小写方法,但 SublimeText 片段使用 perl,我对此了解最简短。快速搜索说,对于小写,我可以\L在替换开始时使用。

/((?<=.)[A-Z][a-zA-Z0-9]*)|((?<=[a-zA-Z])\d+)/\L-\1\2/g

这适用于除第一段的角色之外的所有角色,因此MyFooBar变为My-foo-bar.

我想也许我可以按顺序运行两个正则表达式,但是 perl 或 Sublime 都无法识别。

想法?

编辑:

当我说它使用 perl 时,我只是说它使用 perl 正则表达式。据我所知,我实际上不能执行任意代码;我只能指定一个 perl 可以执行的正则表达式。

这是我的片段的全文:

<snippet>
    <content><![CDATA[
import ${1:module} from '${2:./path/}${1/((?<=.)[A-Z][a-zA-Z0-9]*)|((?<=[a-zA-Z])\d+)/\L-\1\2/g}';
]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>import</tabTrigger>
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <scope>source.js</scope>
</snippet>
4

3 回答 3

1

我将 RegEx 更改为更有用且可能更简单的东西。

**更新

<snippet>
    <content><![CDATA[
import ${1:module} from '${2:./path/}${1/(^[A-Z][a-z]+|[a-z])([A-Z])/\L\1-\2/g}';
]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>import</tabTrigger>
    <scope>source.js</scope>
</snippet>
于 2016-01-27T21:31:49.150 回答
0

这个花了我一点时间,但我相信它可以满足您的需求,所有这些都在一个正则表达式中:

use warnings;
use strict;

while (<DATA>){
    chomp;
    s/([[:upper:]].*?)(?=(?:[[:upper:]]|$))/$+[0]!=length($_) ? lc($1).'-' : lc($1)/ge;
    print "$_\n";
}

__DATA__
MyCamelCase
AVeryLongCamelCaseStringWMXThat

输出:

my-camel-case
a-very-long-camel-case-string-w-m-x-that

解释:它查找一个大写字母,并捕获$1该字母以及所有其他字母,直到它在零宽度前瞻中看到另一个大写字母或字符串结尾。在替换方面,我们使用/e修饰符,这意味着右侧是一个表达式(可执行代码)。如果最近匹配的结尾 ( $+[0]) 小于字符串的长度,我们执行一个较低的 ( lc()) 并附加一个-。如果字符串的长度与最后一个匹配的结尾相同,我们将其小写并完成。

于 2016-01-27T20:46:05.360 回答
0

丑陋的(substr())但有效:

$x = "MyFooBar";
$x =~ s/(?:^|(?<=[a-z])(?=[A-Z]))(.)/-lc($1)/eg;
$x = substr($x, 1);
print $x;
// my-foo-bar

在ideone.com上查看演示。

于 2016-01-27T19:22:55.623 回答