【问题标题】:Regex match line starting with whitespace and first character is non-digit正则表达式匹配行以空格开头且第一个字符是非数字
【发布时间】:2018-02-23 19:34:31
【问题描述】:

我正在尝试创建一个正则表达式,它只匹配以空格开头的行,然后将 1-4 个非数字作为第一个字符,然后在数字后至少有一个或多个空格。此正则表达式的目的是在 Notepad++ 的“查找和替换”选项中使用它来删除任何不以空格开头的行,然后将数字作为行中的第一个字符。

我现在拥有的是允许我匹配以空格开头的行,然后是一组数字和另一个空格。但是,这些是我想要保留的线条。如何修改以下正则表达式,使其匹配除这些行之外的所有其他内容?

/^([\s]+\d[\s]|[\s]+\d\d[\s]|[\s]+\d\d\d[\s])/gm

这是我们使用正则表达式的数据示例。正则表达式应仅匹配不以 1、2、49、50、99 和 100 开头的行。请注意,以“40th”和“5/23/2017”开头的行应匹配。

                                                                      Page 1
          40th Marathon and 25th Marathon Relay
5/23/2017      USATF Certified Marathon (#RE98723UB)      Downtown/City, ST
Timing: Race Services    See our Calendar of Events at www.website.com
             Results questions: http://www.website.com/fixresults
=====================================================================================
                 **** FINAL RESULTS IN NETTIME ORDER ****
Place Div/Tot  Div   Halfway 22miles Guntime  Nettime Pace  Name   
===== ======== ===== ======= ======= =======  ======= ===== =======
    1   1/153  M0139 1:15:08 2:05:50 2:29:20   2:29:20  5:42 Eric
    2   2/153  M0139 1:15:07 2:06:29 2:29:56*  2:29:56  5:44 Bryan
Record 2:17:35 by Randy in 1986
   49   8/77   M4049 1:36:48 2:54:03 3:37:02   3:36:59  8:17 Joshua
   50  28/153  M0139 1:49:45 3:03:56 3:37:38#  3:37:22  8:18 Brian
# Under USATF OPEN guideline
   99   1/16   M6069 1:56:30 3:15:24 3:51:06   3:50:46  8:49 Paul
  100   3/35   F5059 1:50:06 3:11:37 3:51:03   3:50:47  8:49 Ashley
  101   4/35   F5059 1:55:26 3:16:37 3:56:03   3:55:57  9:14 Joan
* Under USATF Age-Group guideline
% For an Explanation of AgeGraded Percentages, See Here: http://www.website.com/agegrading

因此,如果我们在 Notepad++ 中使用正则表达式来查找匹配的字符串/行并替换(删除)它们,则所需的最终结果将如下所示(换句话说,以下行与正则表达式不匹配):

    1   1/153  M0139 1:15:08 2:05:50 2:29:20   2:29:20  5:42 Eric
    2   2/153  M0139 1:15:07 2:06:29 2:29:56*  2:29:56  5:44 Bryan
   49   8/77   M4049 1:36:48 2:54:03 3:37:02   3:36:59  8:17 Joshua
   50  28/153  M0139 1:49:45 3:03:56 3:37:38#  3:37:22  8:18 Brian
   99   1/16   M6069 1:56:30 3:15:24 3:51:06   3:50:46  8:49 Paul
  100   3/35   F5059 1:50:06 3:11:37 3:51:03   3:50:47  8:49 Ashley
  101   4/35   F5059 1:55:26 3:16:37 3:56:03   3:55:57  9:14 Joan

任何帮助将不胜感激。

【问题讨论】:

    标签: regex notepad++


    【解决方案1】:

    See regex in use here

    ^(?! +\d+ ).*\n*
    
    • ^ 在行首断言位置
    • (?! +\d+ ) 负前瞻确保后面不是一个或多个空格,然后是一个或多个数字,然后是一个空格
    • .* 匹配任意字符(\n 除外)任意次数
    • \n* 匹配任意数量的换行符

    结果:

        1   1/153  M0139 1:15:08 2:05:50 2:29:20   2:29:20  5:42 Eric
        2   2/153  M0139 1:15:07 2:06:29 2:29:56*  2:29:56  5:44 Bryan
       49   8/77   M4049 1:36:48 2:54:03 3:37:02   3:36:59  8:17 Joshua
       50  28/153  M0139 1:49:45 3:03:56 3:37:38#  3:37:22  8:18 Brian
       99   1/16   M6069 1:56:30 3:15:24 3:51:06   3:50:46  8:49 Paul
      100   3/35   F5059 1:50:06 3:11:37 3:51:03   3:50:47  8:49 Ashley
      101   4/35   F5059 1:55:26 3:16:37 3:56:03   3:55:57  9:14 Joan
    

    【讨论】:

    • 谢谢!有没有办法将字符串/文件的第一行排除在正则表达式中?我知道我可以手动选择剩余的行,但如果有办法在正则表达式中执行此操作,可以节省一些额外的工作。
    • @irishrunner16 (?!\A)^(?! +\d+ ).*\n* 呢?
    • 效果很好@ctwheels 最后一个问题:有什么方法可以只排除第一次出现的以“Place”开头的行?我知道(?!\A)^(?! +\d+ |.*Place).*\n* 会匹配所有以 Place 开头的行,但如果多行以一个或多个空格开头,然后是“Price”,我们只想排除第一个实例。
    • @irishrunner16 我想不出没有可变宽度后视的方法。
    【解决方案2】:

    如果这是在查找/替换对话框中使用,那么你可以使用一个狡猾的技巧......

    ^(pattern_I_want_to_keep)$|^.*$

    然后替换为

    \1

    任何与您想要保留的内容不匹配的内容都将被删除,但会留下一个空行。可以使用插件或其他正则表达式删除它们。

    这比为您不想保留的内容编造一个匹配项或使用否定前瞻更容易阅读。

    【讨论】:

    • 顺便说一句,我关于在查找/替换中使用它的观点是因为我觉得这清楚地反映了最初的目的,并且更容易“手动”管理。如果我正在编写这个解决方案,那么我会使用另一种方法。
    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2013-07-20
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多