【问题标题】:REGEX .net\powershell match string between stringsREGEX .net\powershell 匹配字符串之间的字符串
【发布时间】:2018-04-26 11:45:44
【问题描述】:

这可能非常简单。我只想匹配字符串中的所有字符串,包括换行符。 示例:

文本文件:

MESSAGE BEGIN

mary had a little lamb.

little lamb

MESSAGE END

输出预期:

mary had a little lamb.

little lamb

这是我目前拥有的。它工作正常,除了所有内容都在 1 行中。

代码(我目前有):

$pattern= Regex::"MESSAGE BEGIN(.*?)MESSAGE END"

[regex]::Match($text,$pattern).Groups[1].Value

结果:

mary had a little lamb.little lamb

我希望它尊重换行符,这样它们就不会全部挤在一起。

【问题讨论】:

  • 你确定没有换行符吗?我建议它们可能在那里,但您在使用的工具中看不到它们。
  • @wp78de 但似乎 dot 已经在换行符之间匹配了。
  • 内容来自一个文本文件,我猜是有返回的。它完全符合我希望它匹配的内容,但它不尊重换行符\换行符。如果我使用了错误的术语,我很抱歉。
  • 如果文件中有换行符,那么应该保留。我猜问题出在你读取文件的方式上。
  • ([\s\S]*?) 不完全是。但它比其他人工作得更好。与我原来的输出相同 (.*?)

标签: regex powershell


【解决方案1】:

使用环视:

(?<=MESSAGE BEGIN)[\s\S]+(?=MESSAGE END)

将匹配(但不包括)MESSAGE BEGIN 和 MESSAGE END 之间的任何文本。

有关 Powershell 中支持的正则表达式的讨论,请访问:https://blogs.technet.microsoft.com/heyscriptingguy/2016/10/21/powershell-regex-crash-course-part-4-of-5/

【讨论】:

    【解决方案2】:

    这里的第一部分是使用像[\s\S]* 这样的模式而不是. 来匹配换行符。您想匹配 lazy+?/*? 以避免匹配太多(例如,如果有多个消息块,则从第一个 MESSAGE BEGIN 到最后一个 MESSAGE END。)

    Pattern:

    MESSAGE BEGIN([\s\S]*?)MESSAGE END
    

    或者如果你只想要内部部分使用环视(仍然懒惰*?):

    (?<=MESSAGE BEGIN)[\s\S]*?(?=MESSAGE END)
    

    端到端代码示例:

    $text = [IO.File]::ReadAllText(".\a.txt")
    
    $matches = [regex]::matches($text, "MESSAGE BEGIN([\s\S]*?)MESSAGE END");
    ForEach($match in $matches) {
      #Write-Output $match.Value.Trim(); #if you use look-arounds
      Write-Output $match.Groups[1].Value.Trim();
    }
    

    【讨论】:

    • 非常感谢,MESSAGE BEGIN([\s\S]*?)MESSAGE END 做到了。
    【解决方案3】:
    MESSAGE BEGIN(\s|\S)*MESSAGE END
    

    (.*?) 匹配所有字符,除了行终止符。

    \s 匹配任何空白字符(等于 [\r\n\t\f\v ])

    \S 匹配任何非空白字符(等于 [^\r\n\t\f\v ])

    包括一个栏 |在捕获组中匹配 \s 或 \S

    然后在捕获组后面加一个星 * 来匹配零到无限个字符

    Link to example

    【讨论】:

      【解决方案4】:

      我在 javascript 中创建了一个示例。

      const texto = `
      MESSAGE BEGIN
      
      mary had a little lamb.
      
      little lamb
      
      MESSAGE END
      `
      
      const regex = /MESSAGE\sBEGIN[\s\S]*MESSAGE\sEND/gi
      
      console.log(texto.match(regex))
      
      The output is:
      [ 'MESSAGE BEGIN\n\nmary had a little lamb.\n\nlittle lamb\n\nMESSAGE END' ]
      

      保留了隔断线。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-13
        • 2021-06-02
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 2013-12-28
        相关资源
        最近更新 更多