代码之家  ›  专栏  ›  技术社区  ›  emsimpson92

使用正则表达式匹配多个标题样式

  •  0
  • emsimpson92  · 技术社区  · 6 年前

    我试图使用regex来捕获节标题,但是为什么我能够用它捕获“4.1 general”,但是如果我在regex的末尾添加一个新行 \n([\d\.]+ ?\w+)\n 它不再捕捉那条线了?是不是没有换行,还是我遗漏了什么?

    Here's my example for reference

    \n([\d\.]+ ?\w+)
    

    输入

    3.6.10
    POLLUTION DEGREE 4
    continuous conductivity occurs due to conductive dust, rain or other wet conditions
    3.6.11
    CLEARANCE
    shortest distance in air between two conductive parts
    3.6.12
    CREEPAGE DISTANCE
    shortest distance along the surface of a solid insulating material between two conductive
    parts
    4 Tests
    4.1 General
    Tests in this standard are TYPE TESTS to be carried out on samples of equipment or parts.
    

    \n([\d\.]+ ?\w+)\n? 似乎也没用。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Wiktor Stribiżew Cristian Lupascu    6 年前

    这是重叠匹配的经典情况。上一个匹配项包含 \n4 Tests\n 最后一个 \n 已被消耗,从而阻止下一个匹配。

    我知道你想匹配整行的文本,所以,使用 ^ $ 锚定 RegexOptions.Multiline 选项:

    @"(?m)^([\d.]+ ?\w+)\r?$"
    

    .NET regex online demo

    注意 $ 在.NET正则表达式中,只有在 \n 而且由于windows的行尾是crlf,因此在 $ , \r? .

    结果:

    enter image description here

        2
  •  0
  •   Sten Petrov    6 年前

    你考虑过新行可能不是一个字符吗?

    \n([0-9\.]+ ?\w+)(\n|\r)
    

    使用expresso,上面的regex与您的示例有4个匹配项,最后一个是

    [LF]4.1 General[CR]
    

    其中[lf]是,而[cr]是。

    记住[CR]、[LF]和[CRLF]都是可能的行尾名称。