【问题标题】:How to search (using regex) for a regex literal in text?如何在文本中搜索(使用正则表达式)正则表达式文字?
【发布时间】:2010-12-01 09:47:12
【问题描述】:

我刚刚偶然发现了一个案例,我必须删除文件中特定正则表达式模式周围的引号,我得出的直接结论是使用 vim 的搜索和替换 util 并转义原始和替换中的每个特殊字符模式。

这行得通(经过一些修补后),但它让我想知道是否有更好的方法来做这些事情。

原始正则表达式(引用):'/^\//' 将替换为 /^\//

我使用的搜索/替换模式: s/'\/\^\\\/\/'/\/\^\\\/\//g

谢谢!

【问题讨论】:

    标签: regex vim escaping


    【解决方案1】:

    您几乎可以使用任何字符作为正则表达式分隔符。这将使您不必逃避正斜杠。您还可以使用组来提取正则表达式并避免重新键入它。例如,试试这个:

    :s#'\(\\^\\//\)'#\1#
    

    我不知道这是否适用于您的情况,因为您列出的示例与您提供的正则表达式不匹配。 (您列出的正则表达式将匹配 '/^\//',而不是 '\^\//'。我的将匹配后者。根据需要进行调整。)

    【讨论】:

    • 感谢有关在 vim 的搜索/替换实用程序中分组的提示 - 我曾尝试使用 $1 语法来引用不起作用的组。也很好地抓住了不匹配的正则表达式,我打错了原件和替换件。
    【解决方案2】:

    您能否通过使用简单的字符串搜索和替换来完全避免使用正则表达式?

    【讨论】:

    • 这是否可以使用 vim 的搜索和替换工具进行字符串搜索,或者 vim 中是否有其他工具可以做到这一点?也许您可以为 fgrep 提供一个替换字符串?这可能是一个很好的答案,在这个特定案例中提供了一些关于实现的细节。
    【解决方案3】:

    请检查这是否适合您 - 在此替代表达式之前定义行号或将光标放在它上面:

    :s:'\(.*\)':\1:

    我为此使用了 vim 7.1。当然,您可以在之前的区域(应执行此表达式(使用“v”或“V”并相应地移动光标))直观地标记一个区域。

    【讨论】:

    • 此模式似乎替换了给定行上任何单引号字符串的第一个 ' 并留下尾随 ' (vim7.2)。也许它与想要贪婪地匹配任何行上第一个和最后一个 ' 之间的所有文本的模式有关(尝试 /'(.*)' )。无论如何,由于表达式替换了任何单引号字符串的第一个引号,因此使用此示例的唯一安全方法是在视觉上标记我想要取消引用的每个字符串
    • 我用 vim7.3 尝试了上面的语句(这对我来说确实也很奇怪),它是通过未修改的 Makefile 编译的,除了在“CONF_OPT_GUI = --disable-gui 中的注释” " 和 "CONF_OPT_X = --without-x" 因为我只在 shell 上使用 vim。它在 vim7.3 中也确实适用于以下输入(在“ ... ”之间):“原始正则表达式(引用):'/^\//' 将替换为 /^\//” ...但是不在同一行包含该输入两次或更多次的行上。请尝试以下表达式:s:'\(.\{-}\)':\1:g
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多