0

我有这个测试数据:

  1. 第 400 部分成功 - Azerjahan Husbai
  2. 分享给 #343 - #18 遗产的执行人 - Homaho Jurei
  3. 以#187 - Shone Jumaja 至#448 - Socsa Husmai 的遗产管理人的身份分享
  4. 以 #187 - Shone Jumaja 至 #445 - Horo Te Fuka 的遗产管理人的身份分享

我有这个正则表达式

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

这里的捕获组总是捕获最后一次出现的 #\d* 所以我当前正则表达式捕获的组的当前结果集是

  1. 400
  2. 18
  3. 448
  4. 445

我想修改正则表达式,使结果集变为:

  1. 400
  2. 343
  3. 448
  4. 445

规则不应该只是捕获第一次出现而不是最后一次我想要的是捕获前面没有“estate of”的组

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

4

1 回答 1

0

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

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

  • 。网
  • Perl 5.10+
  • 聚合酶链反应 7+
  • Java 7+
  • Oniguruma 1.8.4+
  • Ruby 1.9+(默认使用 Oniguruma)
  • Boost.Regex(不确定哪个版本开始支持这个)
  • 带有XRegExp 0.5+的 JavaScript
  • JGsoft 产品,例如 RegexBuddy

好的,所以即使是那个线索也没有把它缩小到足够的范围。使您的正则表达式支持您的新规则的相关功能可能是负面的后视,但并非所有以上都支持后视,并且几乎所有这些都支持后视中的不同功能子

这是一个使用固定长度的负后视的解决方案,以尝试以简单的方式支持广泛的上述风格:

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

有了这个,您需要启用在换行符处生成^和匹配的标志。$您不得启用允许点匹配换行符的标志,也不得启用自由间距和行注释的标志。(这些标志在不同的地方使用不同的名称和字母。)#出于次要的效率原因,我在符号后面放置了否定的lookbehind。

请不要让人们猜测您使用的是什么编程语言和正则表达式风格。

于 2012-05-29T14:46:10.360 回答