Как мне сопоставить с последним набором символов в операторе ИЛИ? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть эта строка, которую я хочу проверить снова:

<<Hello>>
<<I am Going->To>>

expected matches:
Hello
To

, и я использую этот шаблон:

(?<=->|<<)(?:.+)(?=\>{2}|->)

Я хочу, чтобы он соответствовал строке после -> и заканчивается до >>.Если -> не существует, тогда я хочу сопоставить его с <<.

Но написанное мной утверждение or - (?<=->|<<) - немедленно начинает сопоставлять <<.Я надеялся, что он будет выглядеть по порядку через всю строку, но, к сожалению, он рассматривает обе альтернативы одновременно, что имеет больше смысла.

Как бы я подошел к этому?

Ответы [ 3 ]

1 голос
/ 28 марта 2019

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

(?<=<<)(?:(?!->).)+(?=>>)|(?<=->).*?(?=>>)

Regex demo

Объяснение

  • (?<=<<) Положительный взгляд сзади, утверждающий, что прямо слева -
  • (?:(?!->).)+ Соответствует любому символу, если то, что следует, не соответствует ->
  • (?=>>) Утверждают, что прямо справа есть >>
  • | или
  • (?<=->) Позитивный взгляд сзади, утверждают, что прямо слева есть
  • .*? Соответствует любому символу, не жадному
  • (?=>>) Позитивный взгляд, утверждайте, что прямо справа >> >> 1032 *
1 голос
/ 28 марта 2019

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

.*(?:->|<<)(.+)[>-]>

и получите значение группы 1. Смотрите regex demo .

Детали

  • .* - соответствует любым 0+ символам, кроме символов разрыва строки, как можно большему числу
  • (?:->|<<) - соответствует либо ->, либо <<
  • (.+) - из текущего местоположения захватить в группу 1 любые 0+ символов, кроме символов разрыва строки, как можно больше
  • [>-]> - соответствует > или - с последующим >.

enter image description here

C #:

var result = Regex.Match(s, @".*(?:->|<<)(.+)[>-]>")?.Groups[1].Value;
1 голос
/ 28 марта 2019

Попробуйте Regex: (?!.*->)(?<=->|<<)(?:.+)(?=>>)

Демо

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