【问题标题】:Regex catch pattern over multiple lines多行正则表达式捕获模式
【发布时间】:2017-02-08 10:27:50
【问题描述】:

我无法捕捉多行重复的模式。 我相信这是一项简单的任务,但我似乎无法让它发挥作用!

Check this example : Users of (.*\s*)

Users of 85838NAVSIM_F:  (Total of 2 licenses issued;  Total of 2 licenses in use)

----- ends here!

  "85838NAVSIM_F" v1.000, vendor: adskflex
  floating license

    1 RESERVATION for PROJECT 1 (SRV02/27000)

----- should catch to here (and repeat on next)!

Users of 67600NAVMAN_F:  (Total of 2 licenses issued;  Total of 2 licenses in use)

  "67600NAVMAN_F" v1.000, vendor: adskflex
  floating license

    1 RESERVATION for PROJECT 2 (SRV02/27000)

为什么仅仅.*(任何字符,包括换行符?多次)不足以捕捉多行?如何调整正则表达式以使其按预期工作?

谢谢!!

【问题讨论】:

  • 这里的规则是什么?你如何定义模式?
  • 我想捕获“用户”并转发到下一次发生。
  • 好的,喜欢regex101.com/r/SXeVCr/1?
  • “为什么.*(任何字符,包括换行符?多次)不足以捕获多行?”因为. 不匹配JavaScript 正则表达式方言中的换行符。为此,一种选择是使用替代:.|\n。但您的问题可能不止于此。 Wiktor 在这里,他可能会解决问题。

标签: javascript regex


【解决方案1】:

我建议使用缓和的贪婪令牌并依赖[^][\s\S] 来匹配任何字符,因为在 JS 正则表达式中,由于缺少 DOTALL / s 修饰符,无法重新定义点行为。

使用

/^Users of (?:(?!^Users of )[\s\S])*/gim

regex demo

详情

  • ^ - 行的开头(因为使用了m 修饰符,^ 匹配字符串和行的开头)
  • Users of - 文字字符序列
  • (?:(?!^Users of )[\s\S])* - 一个缓和的贪婪令牌匹配任何字符(请参阅[\s\S] = [^])零次或多次(请参阅*),它不会在行首开始 Users of 子字符串

同样展开的正则表达式看起来像

/^Users of .*(?:\r?\n(?!Users of ).*)*/gim

another regex demo

这里,回火的贪婪令牌展开为

  • .* - Users of 之后的其余行
  • (?:\r?\n(?!Users of ).*)* - 零次或多次出现:
    • \r?\n - 换行符(可以替换为(?:\r\n?|\n) 以匹配任何常见样式的换行符)...
    • (?!Users of ) - 后面没有 Users of 子字符串
    • .* - 该行的其余部分。

【讨论】:

  • 完美!非常感谢!不过比我复杂一点! =P
  • 请注意,展开的正则表达式必须更有效,因为它只会在换行时“绊倒”。淬炼后的贪婪令牌会在每个字符上“绊倒”。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多