【问题标题】:Regex to get all lines past last detected string正则表达式以获取最后检测到的字符串之后的所有行
【发布时间】:2014-10-18 14:25:32
【问题描述】:

我有这段文字:

Blah
Blah
Blah
Blah //// CODE --- do not change Blah
Blah
Blah
Blah
Blah //// CODE --- do not change Blah
I
Want
This
Text
Matched

我只想匹配其中的这一部分(检测到 last //// CODE --- 之后的所有行):

I
Want
This
Text
Matched

我尝试过使用(?<=\/\/\/\/ CODE ---).*but this is no good。我想我错过了某种技巧。无论如何,什么是匹配我想要的文本的正则表达式?我正在使用 .NET (C#)。

【问题讨论】:

    标签: c# .net regex text match


    【解决方案1】:

    您可以将此正则表达式与多行和 dotall 标志一起使用并抓取捕获的组 #1:

    \A.*//// CODE ---.*?$\s(.+)\z
    

    RegEx Demo

    【讨论】:

    • 如果将其简化为 .*//// CODE ---.*?$\s(.+),它仍然有效吗?
    • 是的,正则表达式 .*//// CODE ---.*?$\s(.+) 仍然可以在没有锚点 \A\z 的情况下工作
    • 其实连这个:.*//// CODE ---.*?$(.*) 我觉得这个是我最喜欢的。
    • 是的.*//// CODE ---.*?$(.*) 也可以工作,但会以新行开始捕获的组。
    【解决方案2】:

    使用下面的正则表达式并从组索引 1 中获取您想要的文本。

    .*(?<=\/\/\/\/ CODE ---)[^\n]*\n(.*)
    

    DEMO

    [\S\s]*(?<=\/\/\/\/ CODE ---).*\s([\s\S]+)
    

    DEMO

    通过负前瞻。

    (?:\/\/\/\/ CODE ---[^\n]*\n)(?!.*?\/\/\/\/ CODE ---)(.+)
    

    DEMO

    【讨论】:

    • 有什么办法不显式使用\n?
    【解决方案3】:

    你可以使用这个正则表达式

    .*\/\/\/\/ CODE ---.+?\n
    

    带有多行和dotall标志并替换为空字符串

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      相关资源
      最近更新 更多