Совпадение всего между двумя символами разделителя - PullRequest
1 голос
/ 14 мая 2019

Я хочу сопоставить все между разделителями, которые состоят из двух символов слева и справа. Например. <<Hello>>, где << и >> - разделители. Это работает с регулярным выражением \<\<([^\>]+)\>\>.

Но должна быть возможность иметь одинарные символы-разделители < и > в совпадающей строке , например <<\<Hello\>>>, где \<Hello\> должно совпадать.

Это не работает.

Я попытался отвести взгляд: \<\<((?!\>)[^\>]+)\>\> безуспешно.

Мне нужно экранировать символы-разделители.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 14 мая 2019

Вы можете использовать

$r = [regex]'(?<=(?<!\\)(?:\\{2})*)<<([^\\>]*(?:\\.[^\\>]*)*)>>'
$res = $r.Matches('<<Hello\>\>>> <<Test>>') | % {$_.Groups[1].value}

Или

$res = $s | Select-String -Pattern '(?<=(?<!\\)(?:\\{2})*)<<([^\\>]*(?:\\.[^\\>]*)*)>>' -AllMatches | % {$_.matches.groups[1].value}

См. Демоверсию regex .

Если вы хотите получить совпадения бездля доступа к группе 1 поместите << и >> в (?<=<<) lookbehind / (?=>>) lookahead:

$r = [regex]'(?<=(?<!\\)(?:\\{2})*<<)[^\\>]*(?:\\.[^\\>]*)*(?=>>)'
$res = $r.Matches("<<Hello\>\>>> <<Test>>") | % {$_.value}

Или

 $res = $s | Select-String -Pattern '(?<=(?<!\\)(?:\\{2})*<<)[^\\>]*(?:\\.[^\\>]*)*(?=>>)' -AllMatches | % {$_.matches.value}

См. это демонстрационное выражение regex .

Выход:

Hello\>\>
Test

Детали шаблона

  • (?<=(?<!\\)(?:\\{2})*) - первый < в начальном << Сам по себе не может быть экранирован, иначе это недопустимое совпадение
  • << - << подстрока
  • ([^\\>]*(?:\\.[^\\>]*)*) - Группа захвата 1:
    • [^\\>]* - 0 или более символов, отличных от \ и >
    • (?:\\.[^\\>]*)* - ноль или более повторений любого экранированного символа, кроме новой строки, а затем 0 или более символов, отличных от \ и >
  • >> - подстрока >>.
0 голосов
/ 14 мая 2019

Вы можете использовать следующий шаблон: <<(.*?[^\\]?)(?=>>)>>

Работает для следующих случаев:

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

См. Объяснение ...

0 голосов
/ 14 мая 2019

Как насчет использования этого:

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

Вы получаете желаемый результат в группе 1.

Пояснение:

  1. \<{2} начать с 2 << </li>
  2. (.*?)\>{2} соответствует всему, если не достигнет двух последовательных >>
  3. (?!\>) после выполнения шага 2 он должен убедиться, что следующий символ не> (отрицательный взгляд)

Regex101 образец

0 голосов
/ 14 мая 2019

Вы также можете использовать этот шаблон (?<=<<).+?(?=>>)

Объяснение:

(?<=<<) - положительный взгляд назад, уверяет, что то, что было раньше, <<

.+?- соответствует одному или нескольким любым символам, не жадным

(?=>>) - положительный прогноз, заверяет, что следующее >>

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...