Regex中可变数量的匹配/反向引用?

时间:2012-06-25 11:31:06

标签: regex sublimetext boost-regex

我最近花了一些时间将一些SCSS代码转换为Stylus,我的一个正则表达式步骤是删除变量名中的$字符,同时将这些名称格式化为camelCase而不是连字符。

例如,$long-hyphenated-variable-name: value;变为longHyphenatedVariableName = value;,但text-size等参数名称未变为textSize

无论如何,我的正则表达式技能非常有限,所以我只能弄清楚如何将它作为一系列传递,首先查找可能有多达6个部分(5个连字符)的变量名称,然后查找较短的变量名称在后续传递中并将字符串的每个部分作为单独的反向引用传递给我,这样我就可以将第一个字母大写。但我想知道是否有更好的方法来做到这一点:即有没有办法在字符串中获得可变数量的子字符串匹配,并根据您获得的数量提供反向引用?我只是找不到任何相关信息。

这是我的代码,分为六个步骤,如果可能的话,我想简化为一个(我正在考虑编写一个可以将SCSS转换为Stylus以供将来使用的多步骤正则表达式例程)。在每种情况下,搜索表达式后跟替换表达式:

\$(\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

3 个答案:

答案 0 :(得分:0)

如果你使用C#,那么你很幸运,因为它是支持子表达式捕获的少数几种语言之一(如果不是唯一一种)

我对其他语言感兴趣,所以如果您的语言支持请求告诉我们

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110

可以按如下方式查看.NET API

 Matches
     Groups (most regex engines stop here)
         Captures (unique for .NET)

答案 1 :(得分:0)

while ($subject =~ m/(\$\S*?)-/g) {
    $subject =~ s/(\$\S*?)-/$1/g;
}

<强>更新

您可以使用此模式

(?im)(\$(?![a-z-]+\s*:\s*\d+)\S*?)-

s / b替换为无。

在编辑器中,您可以使用多个find-replace来获取所需的输出,或者可以创建一个实现逻辑的简单递归宏。

答案 2 :(得分:0)

有全局替换,它们不是关于匹配的数量。它们可能无法提供问题的一般解决方案,但在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;