Regex 将camel大小写更改为破折号分隔的小写的单个正则表达式
我正在尝试为javascriptRegex 将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
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>