请解释这个正则表达式

时间:2009-12-16 18:09:23

标签: regex textmate oniguruma

正则表达式对我来说完全无效。 我现在正在TextMate中处理一个我想做它的事情...但我不知道为什么它做了我想做的事。

/[[:alpha:]]+|( )/(?1::$0)/g

这在TextMate片段中使用,它的作用是获取Label并将其作为id名称输出。因此,如果我在第一个点输入“First Name”,则输出“FirstName”。 以前它看起来像这样:

/[[:alpha:]]+|( )/(?1:_:/L$0)/g (it might have been \L instead)

这会将“First Name”变为“first_name”。 所以我得到了下划线为空格添加下划线,并且/ L降低了所有内容...但我无法弄清楚其余部分的作用或原因。

有人在乎一件一件地解释它吗?

修改

以下是相关的实际代码段:

<column header="$1"><xmod:field name="${2:${1/[[:alpha:]]+|( )/(?1::$0)/g}}"/></column>

5 个答案:

答案 0 :(得分:6)

这种正则表达式(正则表达式)基本上是:

 /matchthis/replacewiththis/settings

末尾的“g”设置意味着进行全局替换,而不是仅仅将正则表达式限制为特定的行或选择。

进一步分解......

  [[:alpha:]]+|( )

匹配字母数字字符(在参数$0中保存),或者可选地匹配空格(在匹配参数$1中保存)。

  (?1::$0)

正如罗杰所说,?表明这部分是有条件的。如果在参数$1中找到匹配,那么它将替换为冒号::之间的内容 - 在这种情况下没有。如果$1中没有任何内容,则匹配将替换为$0的内容,即不是空格的任何字母数字字符将保持不变。

这解释了为什么在第一个示例中删除了空格,并且在第二个示例中空格将替换为下划线。

在第二个表达式中,\L用于小写文本。

评论中的额外问题是如何在TextMate之外运行此表达式。以vi为例,我将其分为多个步骤:

:0,$s/ //g
:0,$s/\u/\L\0/g

上述命令的第一部分告诉vi从s行开始运行0 ubstitution并在文件末尾结束(这就是$的含义)。

表达式的其余部分使用与上面解释的相同类型的规则,尽管vi中的一些符号有点自定义 - see this reference webpage

答案 1 :(得分:2)

我发现RegexBuddy是处理正则表达式的好工具。我将你的第一个正则表达式粘贴到了Buddy中,我在底部框架中显示了解释:

RegexBuddy

我用它来帮助理解现有的正则表达式,构建自己的正则表达式,测试字符串的正则表达式等等。因为它,我已经变得更好了@ regexs。仅供参考我在Ubuntu的Wine下运行。

答案 2 :(得分:1)

它正在搜索连续至少出现一次[[:alpha:]]+或空格( )的任何字母字符。

答案 3 :(得分:1)

/[[:alpha:]]+|( )/(?1::$0)/g

如果组1(单个空格)匹配,则(?1是条件性的并用于剥离匹配,或者如果组1未匹配,则将匹配替换为$0。由于$0是整个匹配,因此在这种情况下它会被自身替换。这个正则表达式与:

相同
/ //g

即。删除所有空格。

/[[:alpha:]]+|( )/(?1:_:/\L$0)/g

此正则表达式仍然使用相同的条件,除非现在如果组1匹配,则用下划线替换,否则使用完全匹配($0),由\L修改。 \L更改了其后的所有文字的大小写,因此\LABC会导致abc;把它想象成一个特殊的控制代码。

答案 4 :(得分:1)

regular expressions in TextMate这是一个非常全面的资源。 欢呼声。