0

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

例如,$long-hyphenated-variable-name: value;成为但像没有成为的longHyphenatedVariableName = value;参数名称。text-sizetextSize

无论如何,我的正则表达式技能非常有限,所以我只能弄清楚如何通过一系列传递来完成它,首先寻找可能有多达 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
4

3 回答 3

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)
于 2012-06-25T11:34:03.950 回答
0
while ($subject =~ m/(\$\S*?)-/g) {
    $subject =~ s/(\$\S*?)-/$1/g;
}

更新

你可以使用这个模式

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

s/b 替换为无。

在编辑器中,您可以使用多个查找替换来获得所需的输出,或者可以创建一个简单的递归宏来实现逻辑。

于 2012-06-25T11:36:09.570 回答
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;
于 2012-06-25T11:42:57.220 回答