【问题标题】:PowerShell Regex: Capturing strings between two strings that is on multiple linesPowerShell正则表达式:在多行的两个字符串之间捕获字符串
【发布时间】:2020-03-23 08:51:27
【问题描述】:

我可能有这样的事情:

FIRST|[some text here] (newline)
[insert text here] (newline)
SECOND|A (newline)

FIRST|[some text here] (newline)
[insert text here] (newline)
SECOND|B (newline)

FIRST|[some text here] (newline)
[insert text here] (newline)
SECOND|A (newline)

FIRST|[some text here] (newline)
[insert text here] (newline)
SECOND|B (newline)

FIRST|[some text here] (newline)
[insert text here] (newline)
SECOND|A (newline)

我只想捕获从FIRSTSECOND|B 的所有内容,并排除从FIRSTSECOND|A 的所有内容。 这篇文章中的顺序只是一个例子,可能与我正在使用的文件不同。括号中的文本可以是单词、数字、特殊字符等。(换行符)只是告诉你它在不同的行上。 我试过https://regex101.com/r/CwzCyz/2 (FIRST[\s\S]+SECOND\|B) 但这给了我从第一个 FIRST 到最后一个 SECOND|B 这适用于 regex101.com,但不适用于我的 PowerShell ISE 应用程序,我猜这是因为我将风格设置为 PCRE(PHP)。

【问题讨论】:

  • 获取文件内容时使用-Raw,然后使用(?s)FIRST.*?SECOND\|B
  • 这不太行,因为在遇到SECOND|B 之前,SECOND|A 仍将作为匹配的一部分返回。
  • AB 真的是字母 A 和 B,还是它们代表其他东西。我们能找到SECOND|CSECOND|Z 或别的什么吗?

标签: regex powershell regex-group regex-greedy capturing-group


【解决方案1】:

FIRST\|(?:(?!SECOND\|[^B])[\S\s])*?SECOND\|B

将不匹配 FIRST|与 SECOND|A(或任何非 B)相关联

https://regex101.com/r/e0CG9B/1

展开

 FIRST \| 
 (?:
      (?! SECOND \| [^B] )
      [\S\s] 
 )*?
 SECOND \| B

如果需要绝对的内部 FIRST / SECOND 必须以不同的方式完成:

FIRST\|(?:(?!(?:FIRST|SECOND)\|)[\S\s])*SECOND\|B

https://regex101.com/r/qoT8U1/1

【讨论】:

    【解决方案2】:

    如果FIRST 位于行首且SECOND|ASECOND|B 位于行首,则您可以匹配以下所有不以SECOND\|[AB] 开头的行

    ^FIRST.*(?:\r?\n(?!SECOND\|[AB]\b).*)\r?\nSECOND\|B\b.*
    

    部分

    • ^FIRST.*行首
    • (?:非捕获组
      • \r?\n(?!SECOND\|[AB]\b) 匹配换行符,断言不以 SECOND 部分开头
      • .* 匹配除换行符以外的任何字符 0+ 次
    • )关闭非捕获组
    • \r?\n 匹配换行符
    • SECOND\|B\b.*匹配以 SECOND|B 开头的行

    Regex demo

    【讨论】:

      猜你喜欢
      • 2014-12-08
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多