我想匹配由左右两个字符组成的分隔符之间的所有内容。例如。 <<Hello>>
,其中<<
和>>
是分隔符。这适用于正则表达式\<\<([^\>]+)\>\>
。
但是必须有可能在匹配的 字符串中包含单个分隔符<
和>
,例如<<\<Hello\>>>
,其中\<Hello\>
应该匹配。
这不起作用。
我尝试了否定的前瞻:\<\<((?!\>)[^\>]+)\>\>
,但没有成功。
我需要能够转义分隔符。
有什么想法吗?
答案 0 :(得分:1)
您可以使用
$r = [regex]'(?<=(?<!\\)(?:\\{2})*)<<([^\\>]*(?:\\.[^\\>]*)*)>>'
$res = $r.Matches('<<Hello\>\>>> <<Test>>') | % {$_.Groups[1].value}
或
$res = $s | Select-String -Pattern '(?<=(?<!\\)(?:\\{2})*)<<([^\\>]*(?:\\.[^\\>]*)*)>>' -AllMatches | % {$_.matches.groups[1].value}
请参见regex demo。
如果您希望在不访问第1组的情况下获得比赛,请将<<
和>>
放到(?<=<<)
后退/ (?=>>)
后退中:
$r = [regex]'(?<=(?<!\\)(?:\\{2})*<<)[^\\>]*(?:\\.[^\\>]*)*(?=>>)'
$res = $r.Matches("<<Hello\>\>>> <<Test>>") | % {$_.value}
或
$res = $s | Select-String -Pattern '(?<=(?<!\\)(?:\\{2})*<<)[^\\>]*(?:\\.[^\\>]*)*(?=>>)' -AllMatches | % {$_.matches.value}
请参见this regex demo。
输出:
Hello\>\>
Test
模式详细信息
(?<=(?<!\\)(?:\\{2})*)
-开头<
中的第一个<<
本身不能被转义,否则,它不是有效的匹配项<<
-一个<<
子字符串([^\\>]*(?:\\.[^\\>]*)*)
-捕获组1:
[^\\>]*
-除\
和>
以外的0个或更多字符(?:\\.[^\\>]*)*
-任意转义的字符(但换行符)的零个或多个重复,然后是\
和>
以外的0个或多个字符>>
-一个>>
子字符串。答案 1 :(得分:0)
答案 2 :(得分:0)
该如何使用?
\<{2}(.*?)\>{2}(?!\>)
您将在第1组中获得所需的输出。
说明:
\<{2}
以2 <<< / li>开头
(.*?)\>{2}
匹配所有内容,除非连续达到两个>> (?!\>)
在第2步完成后,必须确保下一个字符不是>(负向超前)答案 3 :(得分:0)