请解释这个正则表达式

Jam*_*ght 1 regex textmate oniguruma

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

/[[:alpha:]]+|( )/(?1::$0)/g
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

编辑

以下是有问题的实际代码段:

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

Dan*_*n J 6

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

 /matchthis/replacewiththis/settings
Run Code Online (Sandbox Code Playgroud)

最后的"g"设置意味着进行全局替换,而不是仅仅将正则表达式限制为特定的行或选择.

进一步打破......

  [[:alpha:]]+|( )
Run Code Online (Sandbox Code Playgroud)

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

  (?1::$0)
Run Code Online (Sandbox Code Playgroud)

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

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

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

评论中的额外问题是如何在TextMate之外运行此表达式.使用vi作为一个例子,我会分解成多个步骤:

:0,$s/ //g
:0,$s/\u/\L\0/g
Run Code Online (Sandbox Code Playgroud)

上面命令的第一部分告诉vi s在行开始运行ubstitution 0并在文件末尾结束(这$意味着什么).

表达式的其余部分使用与上面解释的相同类型的规则,尽管vi中的一些符号有点自定义 - 请参阅此参考网页.