仅在有换行符时捕获定界符之间的所有文本

Capturing all text between delimiters only when there is a line feed

仅当分隔符内也有换行符时,我才尝试捕获 2 个分隔符之间的文本。例如,如果我们有以下文本。

Organisation Name <<me.company.name>>
ABN/ACN <<me.company.abn>>
Contact Name <<me.name>>
<<me.PhoneNumber

Another line>>
Email <<me.emailAddress>>

我只想 return <>

\n 可以在任何地方 - 基本上只匹配在 << >> 中至少有一个 \n 并忽略所有其他 << >>

我目前的模式是 <<(.?\n)*?>> 但这捕获了所有 << >>(我使用的是 C#)

这是我尝试过的例子 https://regex101.com/r/sb0wCs/1

非常感谢您的帮助

您可以使用

<<((?:(?!<<|>>).)*?\n(?s:.)*?)>>

regex demo详情:

  • << - << 字符串
  • ((?:(?!<<|>>).)*?\n(?s:.)*?) - 第 1 组:
    • (?:(?!<<|>>).)*? - 不以 >><< 字符序列开头的任何零个或多个字符(换行符除外),尽可能少
    • \n - LF 字符
    • (?s:.)*? - 任何零个或多个字符(包括换行符),尽可能少
  • >> - >> 字符串

在您的模式 <<(.*?\n*)*?>> 中,您有一个捕获组并且所有部分都是可选的,包括换行符,因此非贪婪量词 *? 可以匹配直到第一次出现 >>

此外,当重复捕获组时,组值将保留上一次迭代的值,因此您可以将捕获组放在要捕获的整个部分周围而不使用量词。


如果您的字符串从行首开始,您可以使用锚点并至少匹配不以 << 或 >>

开头的行
^\s*<<(.*(?:\r?\n(?!<<|>>).*)+\r?\n)\s*>>$

说明

  • ^ 字符串开头
  • \s*<< 匹配可选的前导空白字符和 <<
  • ( 捕获 组 1
    • .* 匹配行的其余部分
    • (?:\r?\n(?!<<|>>).*)+ 匹配一个换行符,并重复至少 1 行不以 <<>>
    • 开头的行
  • \r?\n 匹配一个换行符
  • ) 关闭组 1
  • \s*>> 匹配可选的前导空白字符和 >>
  • $ 字符串结束

看到一个regex demo

你可以试试这个:<<[^>]*?\n[^>]*>>

在此处测试正则表达式:https://regex101.com/r/vD3EgE/2

<<[^>]*?\n[^>]*>>

<<      match literal <<
[^>]*?  match any char that is not > as few as possible
\n      match a newline
[^>]*   match any char that is not > as few as possible
>>      match literal >>
  • 仅当 <<>> 之间存在 \n 时才会匹配 a。