匹配两个分隔符之间的所有内容

时间:2019-05-14 07:39:46

标签: regex

我想匹配由左右两个字符组成的分隔符之间的所有内容。例如。 <<Hello>>,其中<<>>是分隔符。这适用于正则表达式\<\<([^\>]+)\>\>

但是必须有可能在匹配的 字符串中包含单个分隔符<>,例如<<\<Hello\>>>,其中\<Hello\>应该匹配。

这不起作用。

我尝试了否定的前瞻:\<\<((?!\>)[^\>]+)\>\>,但没有成功。

我需要能够转义分隔符。

有什么想法吗?

4 个答案:

答案 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)

您也可以使用此模式(?<=<<).+?(?=>>)

说明:

(?<=<<)-积极向后看,确保之前是<<

.+?-匹配任意一个或多个字符(非贪婪)

(?=>>)-正向前进,确保后面是>>

Demo

答案 2 :(得分:0)

该如何使用?

\<{2}(.*?)\>{2}(?!\>)

您将在第1组中获得所需的输出。

说明:

  1. \<{2}以2 <<< / li>开头
  2. (.*?)\>{2}匹配所有内容,除非连续达到两个>>
  3. (?!\>)在第2步完成后,必须确保下一个字符不是>(负向超前)

Regex101 sample

答案 3 :(得分:0)

您可以使用以下模式:<<(.*?[^\\]?)(?=>>)>>

它适用于以下情况:

<<\<Hello\>>>
<<Hello>><<Test>>
<<>>

See explanation...