首页 > 解决方案 > 如何使用 .NET 匹配正则表达式中的最后一个模式?

问题描述

我想提取最接近某个部分的数字。在这个正则表达式中 \d+?[\r\n]+(.*)3.2.P.4.4.\s+Justification\s+of\s+Specifications

目标 - 试图找到一个以数字开头并以给定部分名称结尾的部分。在这种情况下,部分名称为( 3.2.P.4.4. Justification of Specifications)

实际结果 - 正则表达式匹配所有内容,因为模式以数字开头。预期结果 - 正则表达式应从 29 开始,这是该部分最接近的数字。我尝试了许多选项,例如不贪婪的量词等,但似乎没有一个有效。

https://regex101.com/r/Othmck/2

标签: .netregexregex-greedy

解决方案


您可以使用否定前瞻来断言下一行不以空格字符开头,后跟数字和换行符:

^ \d+[\r\n](?:(?!\s+\d+[\r\n]).*[\r\n])*3\.2\.P\.4\.4\.\sJustification\s+of\s+Specifications

查看正则表达式 .NET 演示| C# 演示

解释

  • ^字符串的开始
  • \d+[\r\n]匹配空格、1+ 位和换行符
  • (?:非捕获组
    • (?!断言以下内容的负前瞻不是
      • \s+\d+[\r\n]匹配 1+ 个空白字符、1+ 个数字和换行符
    • )关闭负前瞻
    • .*[\r\n]匹配任何以换行符结尾的字符
  • )*关闭非捕获组并重复 0+ 次
  • 3\.2\.P\.4\.4\.\sJustification\s+of\s+Specifications匹配部分名称

推荐阅读