正则表达式在没有特定案例之前捕获模式

时间:2012-04-19 23:21:30

标签: regex regex-negation

我有这个测试数据:

  1. 部分由#400 - Azerjahan Husbai承担
  2. 分享到#343 - #18的遗产执行人 - Homaho Jurei
  3. 以#187 - Shone Jumaja的遗产管理员为#448 - Socsa Husmai
  4. 以#187 - Shone Jumaja的庄园管理员为#445 - Horo Te Fuka
  5. 我有这个正则表达式

    ^.*#(?<legacyId>\d*).*$
    

    此处的捕获组始终捕获#\ d *的最后一次出现 因此,使用当前正则表达式捕获的组的当前结果集是

    1. 400
    2. 18
    3. 448
    4. 445
    5. 我想修改正则表达式,以便结果集变为:

      1. 400
      2. 343
      3. 448
      4. 445
      5. 规则不应只是捕获第一个匹配而不是最后一个匹配 我想要的是捕获之前的“

        ”的群组

        我怀疑我必须使用正面和负面前瞻的组合?

1 个答案:

答案 0 :(得分:0)

您尚未指定正在使用的编程语言或正则表达式库。这是至关重要的信息。没有它,我只能猜测你可以使用哪些功能。

您提供的唯一重要线索是使用命名捕获。由于您使用的是(?<name>)语法而不是(?P<name>),因此可以将您的正则表达式缩小到以下其中一种:

  • .NET
  • Perl 5.10 +
  • PCRE 7 +
  • Java 7 +
  • Oniguruma 1.8.4 +
  • Ruby 1.9+(默认情况下使用Oniguruma)
  • Boost.Regex(不确定哪个版本支持此版本)
  • 使用XRegExp 0.5 +
  • 的JavaScript
  • 像RegexBuddy这样的JGsoft产品

好的,所以即使这个线索也没有缩小范围。使你的正则表达式支持你的新规则的相关功能可能是负面的看法,但并非所有上述支持看起来都是背后的,并且几乎所有这些都支持看后面的不同子功能。

这是一个使用固定长度负面观察的解决方案,试图以一种简单的方式支持上述各种口味:

^.*#(?<!estate of #)(?<legacyId>\d+)

使用此功能,您需要启用使换行符^$匹配的标记。您不能启用允许点匹配换行符的标志,也不能启用自由间距和行注释的标志。 (这些标志在不同的地方使用不同的名称和字母。)由于效率较低的原因,我在#符号后面放置了负面的背后隐藏。

请不要让人们猜测您正在使用的编程语言和正则表达式。