Regex для разбора строки между двумя маркерами без групп захвата и без маркеров - PullRequest
1 голос
/ 03 апреля 2019

С набором строк следующим образом:

string s1 = "   Identifier1 = Value1                      ## Comment";
string s2 = "   Something = SomeData";
string s3 = "   Name = information\\t\\t\\t## More comments!";
string s4 = "   Nam2 = information";

Мне нужен шаблон регулярного выражения, который будет собирать всю информацию в строке после знака равенства (=) вплоть до концастрока ИЛИ ## маркер комментария, но НЕ захватывайте ни один из них.

Дайте мне (соответственно):

" Value1                      "
" SomeData"
" information\\t\\t\\t"
" information"

Я до сих пор придумал это: (?<=[=]).+(?=(?>##|$))

Это работает, поскольку ему удается захватить весь текст после знака = до конца строки, но оно никогда не работает, когда есть маркер комментария: ##, поскольку он все еще захватывает до концаСтрока, вместо остановки на ##.

... и если я изменю шаблон на: (?<=[=]).+(?=##))

Тогда он только работает на строках с комментариеммаркеры (и останавливается перед ними по желанию).

Так, что я делаю неправильно / отсутствует, чтобы заставить его закончить захват либо непосредственно перед ## ИЛИ в EOL?Кроме того, я не могу использовать явные или неявные группы захвата, так как эти шаблоны передаются в синтаксический анализатор, который превращает их в группы без захвата при обработке.

Я никогда не использовал шаблоны прогнозирования / отставанияпока только последние несколько дней, и этот материал не ломает мне голову ...

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вы можете использовать это регулярное выражение (как видно из употребления здесь ):

(?<==)(?:(?!#{2}).)*
  • (?<==) lookbehind, гарантирующее, что предшествует совпадению = буквально
  • (?:(?!#{2}).)* соответствует любому символу (исключая символ новой строки) любое количество раз, пока не достигнет ##
1 голос
/ 03 апреля 2019

Вы можете использовать это регулярное выражение,

(?<==).*?(?=#{2}|$)

Пояснение:

  • (?<==) - Позитивный взгляд позади, чтобы убедиться, что сопоставленному тексту предшествует =
  • .*? - соответствует любому тексту без жадности
  • (?=#{2}|$) - Позитивный взгляд вперед, чтобы убедиться, что за сопоставленным текстом следует либо ##, либо конец строки $

Демо

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