【问题标题】:Explain this Regular Expression please请解释这个正则表达式
【发布时间】:2009-12-16 18:09:23
【问题描述】:

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

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

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

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

这会将“名字”变成“名字”。 所以我知道下划线为空格添加了下划线,并且 /L 将所有内容都小写了......但我无法弄清楚其余部分的作用或原因。

有人愿意逐条解释吗?

编辑

这里是实际的 sn-p:

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

【问题讨论】:

    标签: regex textmate oniguruma


    【解决方案1】:

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

     /matchthis/replacewiththis/settings
    

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

    进一步分解...

      [[:alpha:]]+|( )
    

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

      (?1::$0)
    

    正如 Roger 所说,? 表示这部分是有条件的。如果在参数 $1 中找到匹配项,则将其替换为冒号 :: 之间的内容 - 在这种情况下什么也没有。如果$1 中没有任何内容,则匹配项将替换为$0 的内容,即任何不是空格的字母数字字符都将被原样输出。

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

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

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

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

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

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

    【讨论】:

    • 这个正则表达式语法在 TextMate 之外可以工作吗?我假设当我输入 TextMate 时,它​​只对我刚刚输入的字符起作用。如何编写此正则表达式以将其应用于整个文件?
    【解决方案2】:

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

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

    【讨论】:

    • 有趣的策略,在回答有关仅适用于 Mac 的程序的问题时建议仅适用于 Windows 的程序。 ;)
    • 大声笑,我什至没有想到这一点。 ;) 正如我提到的,我在 Ubuntu/Wine 下运行。根据regexbuddy.com/usercomm.html“它在 OS-X 上的 Parallels 中运行良好”。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      /[[:alpha:]]+|( )/(?1::$0)/g
      

      (?1 是一个条件表达式,如果匹配到第 1 组(单个空格),则用于去除匹配项,如果第 1 组不匹配,则将匹配项替换为 $0。由于 $0 是整个匹配项,因此在这种情况下它会被替换为自身。此正则表达式与:

      / //g
      

      即删除所有空格。

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

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

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 2010-09-27
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多