【问题标题】:Using regular expressions to do mass replace in Notepad++ and Vim在 Notepad++ 和 Vim 中使用正则表达式进行批量替换
【发布时间】:2008-11-13 16:25:07
【问题描述】:

所以我有一个大文本文件,如下所示:

<option value value='1' >A
<option value value='2' >B
<option value value='3' >C
<option value value='4' >D

它有几百行长,我真的不想手动做。我尝试使用的表达式是:

<option value='.{1,}' >

当我通过几个在线正则表达式测试器运行它时,它按预期工作。我基本上想删除 A、B、C 等之前的所有内容。问题是当我尝试在 Vim 和 Notepad++ 中使用该表达式时,它似乎找不到任何东西。

【问题讨论】:

    标签: regex vim notepad++


    【解决方案1】:

    在 Notepad++ 中,您不需要为此使用正则表达式。

    按住 alt 可让您一次跨多行选择一个矩形文本。选择要删除的块,然后按删除。

    【讨论】:

    • 可能有点晚了,但是对于两年前应该提到但没有提到的第三个选项 +1。当然,vim 也支持矩形选择。
    • 绝对是大+1。没想到 Notepad++ 可以做到这一点。
    【解决方案2】:

    在记事本++中:

    <option value value='1' >A
    <option value value='2' >B
    <option value value='3' >C
    <option value value='4' >D
    
    
    Find what: (.*)(>)(.)
    Replace with: \3
    
    Replace All
    
    
    A
    B
    C
    D
    

    【讨论】:

    • +1 因为它提供了 Notepad++ 中使用的正则表达式语法,而不是 Vim。
    【解决方案3】:

    ABC等之前的所有内容

    这似乎很简单,我一定是误解了你。只是

    :%s/<.*>//
    

    【讨论】:

      【解决方案4】:

      除非我没有理解这个问题,否则有一个非常简单的解决方案。以下正则表达式:

      (.*)(>)(.*)
      

      将匹配您帖子中指定的模式。

      因此,在 notepad++ 中,您可以找到 (.*)(&gt;)(.*) 并将其替换为 \3

      从某种意义上说,正则表达式基本上是贪婪的,如果您指定(.*),它将匹配整行,您要做的就是以某种方式将其分解,以便您可以提取要保留的字符串。在这里,我做了完全相同的事情,它在 Notepad++ 和 Editplus3 中运行良好。

      【讨论】:

      • 我用另一种搜索模式尝试了你的解决方案。我有一个文件,其中包含“a = something”、“b =”、“c = sthelse”行,并且想去掉“a =”并只保留带有管道符号“something| | sthelse”的最后部分。所以我尝试了: (.*)( = )(.) -> |\3 。那给了我一个空文件。我做错了什么?
      • 嘿,你的评论不是很清楚。请评论您现在拥有的内容以及您希望将其更改为的内容。谢谢。
      【解决方案5】:

      您的原始解决方案存在两个问题。首先,您的示例文本:

      <option value value='1' >A
      

      出现了两次“值”字。你的正则表达式没有。此外,您需要在正则表达式的量词中转义左大括号,否则 Vim 会将其解释为文字大括号。此正则表达式有效:

      :%s/<option value value='.\{1,}' >//g
      

      【讨论】:

        【解决方案6】:

        这将删除option 标签,并将字母留在vim中:

        :%s/<option.*>//g
        

        【讨论】:

          【解决方案7】:

          如果您不太具体,它可能会有所帮助。你的表情是“贪婪”,不同的程序可能会以不同的方式解释。在 vim 中试试这个:

          %s/^<[^>]+>//
          

          【讨论】:

          • 需要对“+”进行转义:^]\+> 才能使此表达式起作用。我更喜欢这个版本而不是被投票的@xsl 答案。
          • 拍,你说得对,谢谢指正。谢谢;我一直相信越简单越好,尤其是。说到正则表达式。
          【解决方案8】:

          在记事本++中

          搜索

          (<option value="\w\w">)\w+">(.+)
          

          替换为

          \1\2
          

          【讨论】:

            【解决方案9】:

            在 vim 中

            :%s/<option value='.\{1,}' >//
            

            :%s/<option value='.\+' >//
            

            在 vim 正则表达式中,您必须转义一个或多个符号,捕获括号, 有界数字花括号和其他一些。

            请参阅:help /magic 了解哪些特殊字符需要转义(以及如何更改)。

            【讨论】:

              【解决方案10】:

              遇到同样的问题(使用 jQuery“完成...”字符串),但仅在 Notepad++ 中,我问,收到了很好的友好回复(这让我明白我错过了什么),然后花时间构建一个详细的分步说明,参见Finding Line Beginning using Regular expression in Notepad++

              凡尔赛,2010 年 4 月 27 日星期二 22:53:25 +0200

              【讨论】:

                【解决方案11】:

                记事本++:搜索模式=正则表达式

                查找内容:(.*>)(.)

                替换为:\2

                【讨论】:

                  【解决方案12】:

                  这会奏效。在我的vim中测试过。单引号是个麻烦。

                  1,$s/^<option value value=['].['] >/
                  

                  【讨论】:

                    【解决方案13】:

                    维姆:

                    :%s/.* >//

                    【讨论】:

                      【解决方案14】:

                      事后不久,但如果它对任何人有用,我能够按照此处的一个示例(由 sdgfsdg 提供)并快速学习 Notepad++ 的正则表达式。

                      我必须同样从 HTML 选择下拉选项列表中提取一些冗余数据,格式如下:

                      <select>
                        <option value="AC">saint_helena">Ascension Island</option>
                        <option value="AD">andorra">Andorra</option>
                        <option value="AE">united_arab_emirates">United Arab Emirates</option>
                        <option value="AF">afghanistan">Afghanistan</option>:
                        ...
                      </select>
                      

                      而我真正想要的是:

                      <select>
                        <option value="AC">Ascension Island</option>
                        <option value="AD">Andorra</option>
                        <option value="AE">United Arab Emirates</option>
                        <option value="AF">Afghanistan</option>
                        ...
                      </select>
                      

                      经过一番折腾后,我意识到从 5.8.5 版(2010 年 9 月)开始,正则表达式似乎仍然不允许表达式中的某些循环(除非有另一种语法),例如,以下甚至会发现 ">united_arab_emirated_emirates"> 尽管有额外的分隔下划线:

                      (">)([a-z]+([_]*[a-z]*)*)(">)
                      

                      这个查询在最通用的RegEx tools 中工作,但在 Notepad++ 中,我必须手动计算嵌套下划线的最大数量(不幸的是,它是 8 个),使用更丑陋的方法:

                      (">)([a-z]+[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*)[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*[_]*[a-z]*(">)
                      

                      如果有人知道在 Notepad++ 的替换功能中模拟正则表达式循环的方法,请告诉我。


                      查找内容: *(">)([a-z]+[_][a-z][_][a-z][_][a-z][_][a-z])[_][a-z][_][a-z][ _][a-z][_][a-z](">)*


                      替换为: ">


                      结果: 替换了 255 次。

                      【讨论】:

                        【解决方案15】:

                        这是一篇关于 Notepad++ 正则表达式的好文章
                        http://markantoniou.blogspot.com/2008/06/notepad-how-to-use-regular-expressions.html

                        【讨论】:

                          【解决方案16】:

                          很简单,只需查找:

                          <option value value=.*?>
                          

                          然后点击替换

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2011-09-12
                            • 2014-06-04
                            • 1970-01-01
                            • 2014-04-29
                            • 2012-04-01
                            • 1970-01-01
                            • 2017-09-09
                            • 2017-11-19
                            相关资源
                            最近更新 更多