Как сопоставить символ в середине строки с известным, но префиксным размером префикса

Чтобы быть более конкретным, есть строка (среди других строк в данной строке):

sudo:x:27:foo,bar,baz
         ^---we need to match this character

Префикс известен и может быть выражен как ^sudo:x:\d+

Проблема: положительный взгляд за утверждением должен быть фиксированного размера, иначе я бы использовал (?<=sudo:x:\d+)

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

Детская площадка: http://regex101.com/r/gG9vW6/2

PS: Для тех, кому интересно, зачем мне это:

Это только часть более крупной задачи, которая может быть выражена следующим образом: добавить пользователя в группу sudo, если он еще не существует, со следующими ограничениями синтаксического анализатора (он исходит из используемого программного обеспечения, его нельзя изменить):

  • Вы можете выполнять только операцию замены, поэтому вам нужно сопоставить любой символ
  • Технически невозможно использовать регулярное выражение (matches) и ссылки в строке замены

ОБНОВИТЬ

Есть способ использовать (matches) так что это больше не проблема:-)

Вот как можно сослаться на совпадения в cfengine:

$(match.N)

где N - индекс группы захвата.

См.: https://docs.cfengine.com/docs/3.5/manuals-language-concepts-pattern-matching-and-referencing.html

1 ответ

Решение
(?=^sudo:x:\d+:.*$)(.*):

Вы можете попробовать это.

Заменить:

$(match.1)<your char>

Смотрите демо для эквивалентной версии в PCRE.

Другие вопросы по тегам