【问题标题】:Matching multiple heading styles using regex使用正则表达式匹配多个标题样式
【发布时间】:2018-06-07 21:20:21
【问题描述】:

我正在尝试使用正则表达式来捕获部分标题,但是为什么我能够用它来捕获“4.1 General”,但是如果我在正则表达式 \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? 似乎也不起作用。

【问题讨论】:

  • 它与\n 不匹配,因为上一个匹配项有它。使用$m 修饰符,或(?=\n)。见regex101.com/r/EGyxI4/2。在 .NET 中,使用 CRLF 结尾,您将需要 (?m)\n([\d.]+ ?\w+)\r?$。甚至(?m)^(\d[\d.]* ?\w+)\r?$.
  • 谢谢。我认为单独的比赛可以共享项目。这更有意义。

标签: c# regex


【解决方案1】:

这是重叠匹配的经典案例。上一个匹配包含\n4 Tests\n,而最后一个\n 已被消耗,因此阻止了下一个匹配。

我看到您想匹配整行文本,因此,将^$ 锚点与RegexOptions.Multiline 选项一起使用更有意义:

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

.NET regex online demo

请注意,.NET 正则表达式中的 $ 仅在 \n 之前匹配,并且由于 Windows 行尾是 CRLF,因此需要在 $\r? 之前使用可选的 CR。

结果:

【讨论】:

  • 感谢维克托。但是将\w+ 更改为\w* 会更好。因为例如在3.6.12 中,[\d.]+ 捕获3.6.1 和` ?\w+` 捕获2
  • @HusseinGolshani 谢谢,这可能是一个正确的补充,但是,整个问题是在换行符之间(或在单独的行上)匹配一个字符串,这就是我在回答中所强调的。
【解决方案2】:

你有没有考虑过换行可能不是单个字符?

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

使用 Expresso,上面的正则表达式从您的样本中有 4 个匹配项,最后一个是

[LF]4.1 General[CR]

其中 [LF] 为 \n,[CR] 为 \r。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2014-04-18
    • 1970-01-01
    • 2018-07-17
    相关资源
    最近更新 更多