Regex 正则表达式中匹配/反向引用的可变数量?
我最近花了一些时间将一些SCSS代码转换为手写笔,我的正则表达式步骤之一是去掉变量名中的Regex 正则表达式中匹配/反向引用的可变数量?,regex,sublimetext,boost-regex,Regex,Sublimetext,Boost Regex,我最近花了一些时间将一些SCSS代码转换为手写笔,我的正则表达式步骤之一是去掉变量名中的$字符,同时将这些名称格式化为camelCase而不是连字符大小写 例如,$long连字符变量名:value变为长连字符VariableName=value但是参数名如text size没有变成textSize 无论如何,我的正则表达式技能非常有限,所以我只能通过一系列的过程来解决这个问题,首先查找可能包含多达6个部分(5个连字符)的变量名,然后在后续过程中查找较短的变量名,并将字符串的每个部分作为单独的反向
$
字符,同时将这些名称格式化为camelCase而不是连字符大小写
例如,$long连字符变量名:value代码>变为长连字符VariableName=value
但是参数名如text size
没有变成textSize
无论如何,我的正则表达式技能非常有限,所以我只能通过一系列的过程来解决这个问题,首先查找可能包含多达6个部分(5个连字符)的变量名,然后在后续过程中查找较短的变量名,并将字符串的每个部分作为单独的反向引用传递,这样我就可以大写第一个字母。但我想知道是否有更好的方法:即,是否有一种方法可以在字符串中获得可变数量的子字符串匹配,并根据得到的子字符串数量提供回引用?我就是找不到这方面的任何信息
这是我的代码,分为六个步骤,如果可能的话,我想将其浓缩为一个步骤(我正在考虑编写一个多步骤正则表达式例程,可以将SCS转换为手写笔以备将来使用)。在每种情况下,搜索表达式后跟替换表达式:
\$(\S*?)\-(\S*?)\-(\S*?)\-(\S*?)\-(\S*?)\-(.)
$1\u$2\u$3\u$4\u$5\u$6
\$(\S*?)\-(\S*?)\-(\S*?)\-(\S*?)\-(.)
$1\u$2\u$3\u$4\u$5
\$(\S*?)\-(\S*?)\-(\S*?)\-(.)
$1\u$2\u$3\u$4
\$(\S*?)\-(\S*?)\-(.)
$1\u$2\u$3
\$(\S*?)\-(.)
$1\u$2
\$(.)
$1
如果你使用C#你很幸运,因为它是少数支持子表达式捕获的语言之一(如果不是唯一的语言的话)
我对其他语言感兴趣,所以如果您的语言支持,请告诉我们
)
NET API可以如下所示
Matches
Groups (most regex engines stop here)
Captures (unique for .NET)
更新
你可以使用这种模式
将s/b替换为“无”
在编辑器中,您可以使用多个查找替换来获得所需的输出,或者可以创建一个实现逻辑的简单递归宏。有全局替换,它们与匹配的数量无关。它们可能无法提供问题的一般解决方案,但在sed
中,您可以执行以下操作:
$ sample='$test-size: 12; $long-hyphenated-variable-name: value;'
$ echo $sample | sed 's/-\(\w\)/\U\1/g; s/\$\(\w\+\):/\1 =/g'
testSize = 12; longHyphenatedVariableName = value;
这可能是解决方案,但我不知道如何实现它——我只是在文本编辑器的查找和替换功能中使用Regex。有没有办法在这种情况下应用这一点?或者我还可以/应该使用什么?仅供参考,我添加了boost regex
标记,因为这似乎是Sublime文本使用的味道。
(?im)(\$(?![a-z-]+\s*:\s*\d+)\S*?)-
$ sample='$test-size: 12; $long-hyphenated-variable-name: value;'
$ echo $sample | sed 's/-\(\w\)/\U\1/g; s/\$\(\w\+\):/\1 =/g'
testSize = 12; longHyphenatedVariableName = value;