【问题标题】:Match lines not starting with first two specific characters匹配不以前两个特定字符开头的行
【发布时间】:2016-06-14 11:25:45
【问题描述】:

我正在尝试匹配不以“CD”或任何 2 位数字开头的行。我试过了:

^[^Cc0-9][^Dd0-9].+?$

但它不匹配以“Cx”或“0y”开头的行。

我正在使用一个名为rxrepl 的程序,上面的正则表达式作为搜索字符串,没有任何替换。我试图避免使用 grep。另外我不能使用括号,因为在 rxrepl 中它们用于捕获组。

【问题讨论】:

  • ^(?:CD|\d{2}).+?$
  • 有没有办法避免使用括号?它们用于在 rxrepl 中捕获组。
  • (?: 将避免捕获
  • @PranavCBalan:不,你不能。这将匹配字符串开头的 CD 或任何位置的两个数字。 .+.+? 也很奇怪而且是多余的
  • ^(?:CD|\d{2}).+?$ 与我想要实现的目标相反。您在我的表达式中看到,我实际上是在尝试匹配不以 CD 或 2 位数字开头的行,因此我可以用任何内容替换它们,以便只保留以 CD 开头的行和两位数字。

标签: regex grep pcre


【解决方案1】:

正如其他人所说,你需要

^(?:CD|\d\d)

(?: ... ) 是一个非捕获

或者如果您必须避免使用任何类型的括号,然后使用

^CD|^\d\d


更新

为了符合您的新规范“我实际上是在尝试匹配行 不是 以 CD 或 2 位数字开头”

^(?!CD|\d\d)

您需要克服括号中的问题。负前瞻是fine in PCRE 并且不捕获

【讨论】:

    【解决方案2】:

    它要么是CD,要么是两个数字。所以你必须像这样使用群组(group1|group2)

    ^(CD|[0-9]{2})
    # ^^ ^^^^^^^^
    # |         |   
    # either CD |
    #           or two digits
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多