仅在有换行符时捕获定界符之间的所有文本
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。
仅当分隔符内也有换行符时,我才尝试捕获 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。