【问题标题】:Regular expression group/substitution question正则表达式组/替换问题
【发布时间】:2019-12-09 17:59:46
【问题描述】:

我有以下两个正则表达式。我的目标是提取“EX”之后的所有内容

示例 1:

(^[EX]{2})(\w+)

示例数据

EX12456

https://regex101.com/r/6QqHwf/13

匹配信息显示第 2 组是我想要的数据,并且与 SUBSTITUTION $2 匹配。

示例 2:

(?<=EX)(?s)(.*$)

示例数据

123456/stackoverflo@|EX789

https://regex101.com/r/6QqHwf/12

匹配信息显示第 1 组是我想要的数据,但与 SUBSTITUTION $1 不匹配。

如何在 SUBSTITUTION 中添加/输入日期“789”?谢谢!!!

【问题讨论】:

  • “替换”会删除匹配的内容,并忽略剩下的内容。您的原始正则表达式将匹配 EX 并允许将其删除,但您的第二个正则表达式 not 匹配 123456/stackoverflo@|EX,因此不会被删除。请改用.*(?&lt;=EX)(?s)(.*$) - 这匹配字符串的第一部分并允许您将其删除。 Demo
  • @NickReed 谢谢!!!!只是好奇,.* 是否意味着匹配直到 EX 的所有内容?
  • 解释见答案; . 表示“任何字符”,* 表示“0 次或多次” - 它匹配整个字符串,然后回溯以确保您的后向匹配。

标签: regex


【解决方案1】:

“替换”会删除匹配的内容,并忽略留下的内容。您的原始正则表达式将匹配 EX 并允许将其删除,但您的第二个正则表达式与 123456/stackoverflo@|EX 不匹配,因此不会将其删除。请改用.*(?&lt;=EX)(?s)(.*$) - 这匹配字符串的第一部分并让您删除它。

请注意,.* 匹配整个字符串 - 但是,后向 (&lt;=EX) 然后强制它放弃部分匹配以满足约束。 (.* 表示“除换行符以外的任何字符,重复零次或多次。”)

Demo

【讨论】:

    【解决方案2】:

    如果您想提取EX 之后的所有内容,则不必使用任何捕获组,可以使用positive lookbehind (?&lt;=

    注意 [EX]character class 将匹配 E 或 X

    (?<=EX).*
    

    Regex demo

    在第二个模式中只有一个匹配,即第 1 组。如果您替换为第 1 组,您将得到相同的起始值。

    如果只有一次出现 EX,您可以做的是匹配它并在替换中使用第 1 组(例如 $1),这样匹配就不会成为结果的一部分。

    ^.*EX(.*$)
    

    Regex demo

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多