【问题标题】:Use cases for regular expression find/replace正则表达式查找/替换的用例
【发布时间】:2008-09-09 13:30:38
【问题描述】:

我最近与一位同事讨论了编辑器。他使用了一个不太受欢迎的编辑器,而我使用了另一个(我不会说是哪个,因为它不相关,我想避免编辑器的火焰战争)。我是说我不太喜欢他的编辑器,因为它不允许您使用正则表达式进行查找/替换。

他说他从来不想这样做,这很令人惊讶,因为我发现自己一直在做这件事。然而,在我的脑海中,我无法想出超过一两个例子。这里的任何人都可以提供一些他们发现正则表达式查找/替换在他们的编辑器中有用的时间示例吗?以下是我从那时起能够想出的作为我实际必须做的事情的例子:

  1. 去除文件中每一行的开头,如下所示:
    Line 25634 :
    Line 632157 :

  2. 获取几十个带有标准标题的文件,每个文件的标题略有不同,然后一次性删除所有文件的前 19 行。

  3. 将 MySQL select 语句的结果通过管道传输到文本文件中,然后删除所有格式化垃圾并将其重新格式化为 Python 字典,以便在简单脚本中使用。

  4. 在没有转义逗号的 CSV 文件中,将每行第 8 列的第一个字符替换为大写 A。

  5. 给定一堆 GDB 堆栈跟踪,其中包含
    #3 0x080a6d61 in _mvl_set_req_done (req=0x82624a4, result=27158) at ../../mvl/src/mvl_serv.c:850
    去掉每一行的所有内容,除了函数名。

还有其他人有任何现实生活中的例子吗?下次遇到这个问题时,我想更充分地准备列出为什么这个功能有用的好例子。

【问题讨论】:

    标签: regex editor


    【解决方案1】:

    就在上周,我使用正则表达式查找/替换将 CSV 文件转换为 XML 文件。

    真的很简单,只需切掉每个字段(幸运的是它没有任何转义的逗号),然后用适当的标签代替逗号将其推回。

    【讨论】:

      【解决方案2】:

      正则表达式使使用单词边界替换整个单词变得容易。

      (\b\w+\b)
      

      这样您就可以替换文件中不需要的单词,而不会干扰诸如 Scunthorpe

      之类的单词

      【讨论】:

        【解决方案3】:

        昨天我为 Oracle 表创建了一个创建表语句,并使用 JDBC 和 PreparedStatements 将字段转换为 setString() 方法调用。表的字段名称已映射到我的类属性,因此正则表达式搜索和替换非常适合。

        创建表格文本:

        ...
        field_1 VARCHAR2(100) NULL,
        field_2 VARCHAR2(10) NULL,
        field_3 NUMBER(8) NULL,
        field_4 VARCHAR2(100) NULL,
        ....
        

        我的正则表达式搜索:

        /([a-z_])+ .*?,?/
        

        我的替代品:

        pstmt.setString(1, \1);
        

        结果:

        ...
        pstmt.setString(1, field_1);
        pstmt.setString(1, field_2);
        pstmt.setString(1, field_3);
        pstmt.setString(1, field_4);
        ....
        

        然后,我为每个调用手动设置位置 int 并在必要时将方法更改为 setInt() (和其他),但这对我来说很方便。我实际上使用它三四次,用于方法调用转换的类似字段。

        【讨论】:

          【解决方案4】:

          我喜欢使用正则表达式来重新格式化这样的项目列表:

          int item1
          double item2
          

          public void item1(int item1){
          }
          public void item2(double item2){
          }
          

          这可以节省大量时间。

          【讨论】:

            【解决方案5】:

            当有人向我发送列中的患者就诊编号列表(例如 100-200)并且我需要以“0000000444”、“000000004445”格式显示时,我一直使用它。为我创造奇迹!

            我还用它来提取电子邮件中的电子邮件地址。我经常发送群组电子邮件,所有退回的退货都会在一封电子邮件中返回。因此,我使用正则表达式将它们全部拉出,然后将它们放入字符串 var 中以从数据库中删除。

            我什至写了一个小对话框程序来将正则表达式应用于我的剪贴板。它抓取内容并应用正则表达式,然后将其加载回剪贴板。

            【讨论】:

              【解决方案6】:

              我在 Web 开发中一直使用它的一件事是剥离其 HTML 标记的一些文本。为了安全起见,或者为了显示新闻文章的预览,可能需要执行此操作来清理用户输入。例如,如果您的文章包含大量用于格式化的 HTML 标签,您不能只执行 LEFT(article_text,100) + '...' (加上“阅读更多”链接)并将其呈现在页面上通过拆分 HTML 标记来破坏页面的风险。

              另外,我不得不在链接到不再存在的图像的数据库记录中去除 img 标签。我们不要忘记 Web 表单验证。如果您想让用户在 Web 表单中输入正确的电子邮件地址(从语法上讲),这是彻底检查它的唯一方法。

              【讨论】:

                【解决方案7】:

                我刚刚将一个长字符序列粘贴到一个字符串文字中,现在我想将它分解成一个较短的字符串文字的串联,这样它就不会换行。我也希望它是可读的,所以我只想在空格之后打破。我选择整个字符串(减去引号)并使用此正则表达式进行选择中的全部替换:

                /.{20,60} /
                

                ...还有这个替换:

                /$0"¶         + "/
                

                ...其中 pilcrow 是一个实际的换行符,并且空格的数量从一个事件到下一个事件不同。结果:

                String s = "I recently discussed editors with a co-worker. He uses one "
                         + "of the less popular editors and I use another (I won't say "
                         + "which ones since it's not relevant and I want to avoid an "
                         + "editor flame war). I was saying that I didn't like his "
                         + "editor as much because it doesn't let you do find/replace "
                         + "with regular expressions.";
                

                【讨论】:

                  【解决方案8】:

                  我对任何编辑器做的第一件事就是尝试找出它是正则表达式的奇怪之处。我用它所有的时间。没什么特别疯狂的,但是当您必须在不同类型的文本之间复制/粘贴内容时它会很方便 - SQL PHP 是我最常做的一种 - 而且您不想放屁进行相同的更改 500次。

                  【讨论】:

                    【解决方案9】:

                    每当我尝试替换跨多行的值时,Regex 都非常方便。或者当我想用包含换行符的东西替换一个值时。

                    我也喜欢您可以在正则表达式中匹配内容,而不是使用 $# 语法替换完整匹配以输出您想要维护的匹配部分。

                    【讨论】:

                      【解决方案10】:

                      我在 345 点上同意你的观点,但不一定在 1 和 2。

                      在某些情况下,12 使用匿名键盘宏更容易实现。

                      我的意思是执行以下操作:

                      1. 将光标放在第一行
                      2. 开始录制键盘宏
                      3. 修改第一行
                      4. 将光标定位到下一行
                      5. 停止记录。

                      现在修改下一行所需要做的就是重复宏。

                      我可以不支持正则表达式,但不能不支持匿名键盘宏。

                      【讨论】:

                        猜你喜欢
                        • 2012-06-06
                        • 2014-11-18
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-03-21
                        相关资源
                        最近更新 更多