1

正则表达式对我来说完全是空白。我现在正在处理 TextMate 中的一个,它可以做我想做的事情......但我不知道为什么它会做我想做的事情。

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

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

/[[: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>
4

4 回答 4

6

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

 /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并在文件末尾结束的替换(这就是$意思)。

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

于 2009-12-16T18:20:14.163 回答
2

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

正则表达式好友

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

于 2009-12-16T18:57:06.927 回答
1

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

于 2009-12-16T18:14:16.737 回答
1
/[[:alpha:]]+|( )/(?1::$0)/g

(?1是一个条件,如果第 1 组(单个空格)匹配,则用于去除匹配项,或者$0如果第 1 组不匹配,则将匹配项替换为。就像$0整个比赛一样,在这种情况下它会被自己替换。此正则表达式与以下内容相同:

/ //g

即删除所有空格。

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

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

于 2009-12-16T18:18:54.493 回答