Regex 请解释一下这个正则表达式
正则表达式对我来说是一片空白。 我现在正在处理TextMate中的一个,它做了我希望它做的事情…但我不知道为什么它做了我希望它做的事情Regex 请解释一下这个正则表达式,regex,textmate,oniguruma,Regex,Textmate,Oniguruma,正则表达式对我来说是一片空白。 我现在正在处理TextMate中的一个,它做了我希望它做的事情…但我不知道为什么它做了我希望它做的事情 /[[:alpha:]]+|( )/(?1::$0)/g 这在TextMate代码段中使用,它的作用是获取标签并将其作为id名称输出。因此,如果我在第一个位置键入“FirstName”,这将输出“FirstName”。 以前是这样的: /[[:alpha:]]+|( )/(?1:_:/L$0)/g (it might have been \L instead)
/[[:alpha:]]+|( )/(?1::$0)/g
这在TextMate代码段中使用,它的作用是获取标签并将其作为id名称输出。因此,如果我在第一个位置键入“FirstName”,这将输出“FirstName”。
以前是这样的:
/[[:alpha:]]+|( )/(?1:_:/L$0)/g (it might have been \L instead)
这将把“名字”变成“名字”。
所以我知道下划线为一个空格添加了一个下划线,/L将所有内容都小写…但是我不知道它的其余部分是做什么的,或者为什么
有人愿意一件一件地解释一下吗
编辑
下面是有问题的实际片段:
<column header="$1"><xmod:field name="${2:${1/[[:alpha:]]+|( )/(?1::$0)/g}}"/></column>
它正在搜索在一行中至少出现一次的任何字母字符
[:alpha:]+
或空格()
它正在搜索在一行中至少出现一次的任何字母字符[:alpha:]+
或空格()
(?1
是一个条件,如果组1(一个空格)匹配,则用于去除匹配项;如果组1不匹配,则用$0
替换匹配项。由于$0
是整个匹配项,因此在这种情况下,它将被自身替换。此正则表达式与:
/ //g
即删除所有空格
/[[:alpha:]]+|( )/(?1:_:/\L$0)/g
此正则表达式仍使用相同的条件,除非现在组1匹配,否则将替换为下划线,否则将替换为完全匹配($0
)使用,由\L
修改\L
更改其后面所有文本的大小写,因此\LABC
将导致abc
;将其视为一个特殊的控制代码
(?1
是一个条件,如果组1(一个空格)匹配,则用于去除匹配项;如果组1不匹配,则用$0
替换匹配项。由于$0
是整个匹配项,因此在这种情况下,它将被自身替换。此正则表达式与:
/ //g
即删除所有空格
/[[:alpha:]]+|( )/(?1:_:/\L$0)/g
此正则表达式仍使用相同的条件,除非现在组1匹配,否则将替换为下划线,否则将替换为完全匹配($0
)使用,由\L
修改\L
更改其后面所有文本的大小写,因此\LABC
将导致abc
;将其视为一个特殊的控制代码。此正则表达式(regex)格式基本上是:
/matchthis/replacewiththis/settings
末尾的“g”设置意味着进行全局替换,而不仅仅是将正则表达式限制为特定的行或选择
进一步分解它
[[:alpha:]]+|( )
匹配字母数字字符(保存在参数$0
中)或可选的空格(保存在匹配参数$1
中)
正如Roger所说,?
表示这部分是有条件的。如果在参数$1
中找到匹配项,则它将替换为冒号之间的内容:
-在这种情况下没有任何内容。如果$1
中没有任何内容,则匹配项将替换为$0
的内容,即任何字母数字字符不是空格的r输出不变
这解释了为什么在第一个示例中删除空格,而在第二个示例中用下划线替换空格
在第二个表达式中,\L
用于将文本小写
评论中的额外问题是如何在TextMate之外运行此表达式。以vi
为例,我将其分为多个步骤:
:0,$s/ //g
:0,$s/\u/\L\0/g
上述命令的第一部分告诉vi运行一个s
替换,从第0行开始,在文件末尾结束(这就是$
的意思)
表达式的其余部分使用与上述相同的规则,尽管vi中的一些表示法有点自定义-。此正则表达式(regex)格式基本上是:
/matchthis/replacewiththis/settings
末尾的“g”设置意味着进行全局替换,而不仅仅是将正则表达式限制为特定的行或选择
进一步分解它
[[:alpha:]]+|( )
匹配字母数字字符(保存在参数$0
中)或可选的空格(保存在匹配参数$1
中)
正如Roger所说,?
表示这部分是有条件的。如果在参数$1
中找到匹配项,则它将替换为冒号之间的内容:
-在这种情况下没有任何内容。如果$1
中没有任何内容,则匹配项将替换为$0
的内容,即任何字母数字字符不是空格的r输出不变
这解释了为什么在第一个示例中删除空格,而在第二个示例中用下划线替换空格
在第二个表达式中,\L
用于将文本小写
评论中的额外问题是如何在TextMate之外运行此表达式。以vi
为例,我将其分为多个步骤:
:0,$s/ //g
:0,$s/\u/\L\0/g
上述命令的第一部分告诉vi运行一个s
替换,从第0行开始,在文件末尾结束(这就是$
的意思)
表达式的其余部分使用了与上述相同的规则,尽管vi中的一些符号有点自定义-。我发现了一个处理正则表达式的好工具。我将您的第一个正则表达式粘贴到Buddy中,得到了底部框架中所示的解释:
我用它来帮助理解现有的正则表达式,构建我自己的正则表达式,根据字符串测试正则表达式,等等。正因为如此,我在@regexs上变得更好了。仅供参考,我在Ubuntu上运行Wine。我找到了一个处理正则表达式的好工具。我将你的第一个正则表达式粘贴到Buddy上,我得到了底部框架中显示的解释:
我用它