Regex 将camel大小写更改为破折号分隔的小写的单个正则表达式

Regex 将camel大小写更改为破折号分隔的小写的单个正则表达式,regex,pcre,sublimetext-snippet,Regex,Pcre,Sublimetext Snippet,我正在尝试为javascriptimport语句编写升华文本。我希望格式如下所示: import MyFooBar from 'my-foo-bar'; 我的正则表达式的输入是MyFooBar,输出需要是MyFooBar。我找到了一个几乎适用于以下领域的答案: 寻找 ((?丑陋(substr())但工作: $x = "MyFooBar"; $x =~ s/(?:^|(?<=[a-z])(?=[A-Z]))(.)/-lc($1)/eg; $x = substr($x, 1); print

我正在尝试为javascript
import
语句编写升华文本。我希望格式如下所示:

import MyFooBar from 'my-foo-bar';
我的正则表达式的输入是
MyFooBar
,输出需要是
MyFooBar
。我找到了一个几乎适用于以下领域的答案:

寻找

((?丑陋(
substr()
)但工作:

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

$x=~s/(?:^ |)(?这一个花了我一点时间,但我相信它做了你想要的,都在一个正则表达式中:

use warnings;
use strict;

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

__DATA__
MyCamelCase
AVeryLongCamelCaseStringWMXThat

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

我将RegEx更改为更有用且可能更简单的内容

**已更新


进口
source.js

为什么它必须是正则表达式?这将更容易通过适当的搜索和替换函数来处理,perl有…@cat我只是在学习如何创建代码段,但只显示了一种替换方法。@anubhava OPs最后一句是这里的问题。您运行2个正则表达式来更正“错误”在第一个字符上,这显然不起作用。请上传您当前的完整代码段好吗?@revo我已经更新了问题。这不起作用,因为崇高的代码段实际上不是在解释Perl——它们只是使用PCRE语法。我复制并粘贴到我的代码段中,然后运行它。
import MyFooBar from./path/my[1]!=length$-1?lcMy.-':lcMyFoo[1]!=length$-1?lcFoo.-':lcFooBar[1]!=length$-1?lcBar.-':lcBar'.
很好的尝试!啊,废话:)我错过了关于代码不执行的部分。这是我第一次使用
$+[0]
$-[0]
,所以我们中至少有一个人从中获益:)向上投票,但如果您传入类似MyFooBarID的内容,又如何?这将在我的模块文件名前面加上一个
-
。我可以删除它,但这基本上是我现在必须做的,替换第一个大写字符。@dfoverdex哦,是的,但是当我输入
时,额外的破折号消失了!奇怪的是,它不适合我。。。事实上,当我按下enter键时,它在两个点上都用regex的d值替换了我输入的内容。如此接近。我认为它可以工作,直到我尝试“环境”。如果没有第二个大写字母,那么这个词就不会被替换。只替换第一个字符不是什么大问题。唉,我认为这种特殊的努力是不可能的。可以通过将
-\2
更改为
(?2-\2)
。完整的正则表达式行:
从“${2:./path/}${1/(^[a-Z]导入${1:module[a-z]*|[a-z])([a-z])?/\L\1(?2-\2)/g}';
$x = "MyFooBar";
$x =~ s/(?:^|(?<=[a-z])(?=[A-Z]))(.)/-lc($1)/eg;
$x = substr($x, 1);
print $x;
// my-foo-bar
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
<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>