смотреть назад со случайной строкой - обходной путь?

следующие сценарии:

stringN stringA-stingB:stringC:stringD
stringN -stingB:stringC:stringD
stringN -stingB:stri:ngD
stringN stringA-stingB:stringD

У меня есть следующее регулярное выражение:

^(?<groupN>.*?)\s(?<groupA>.*?)?-(?<groupB>.*?):((?<groupC>.*?):)?(?<groupD>.*?)$

Проблема возникает в сценарии 3 (строка 3), где есть: внутри группы захвата: groupD, что делает эту полосу включенной в группу захвата groupC. Мне нужно в сценарии 3 поймать stri:ngD в groupD, чтобы не было значения для groupC. Обычно я думал о ретроспективном просмотре с подстановочным знаком, но получаю сообщение об ошибке, поскольку подстановочный знак не поддерживается в ретроспективном просмотре, так что есть ли другой способ сделать это?

введите здесь описание изображения


person aalb2993    schedule 17.12.2020    source источник
comment
Какова логика решения о том, что двоеточие не следует рассматривать как разделитель?   -  person trincot    schedule 18.12.2020
comment
Это формат журнала, поэтому я знаю, что он такой, но поскольку это строка, очевидно, может быть любой char fx::   -  person aalb2993    schedule 18.12.2020
comment
Извините, я этого не понимаю. Попробую спросить по-другому. Что должно произойти с abcd:efgh, или с abcde:fghi, или с abcdef:ghi, или с abcdef:gh, .... Когда регулярное выражение должно решить, что группа C должна быть пустой, а когда нет?   -  person trincot    schedule 18.12.2020
comment
хороший вопрос, но у меня нет четкого ответа, и я понимаю, что вы имеете в виду. Это API, и мне сказали, что groupA и groupC иногда могут отсутствовать. Я просто знаю из контента, что этот сценарий происходит как при изменении контента, но нет другой логики, чем о том, как решить, является ли его группа C   -  person aalb2993    schedule 18.12.2020
comment
Если у вас нет ответа, как мы можем?   -  person trincot    schedule 18.12.2020
comment
хорошо, скажем, есть значение N/A для группы B, когда группа C отсутствует. Поможет ли это?   -  person aalb2993    schedule 18.12.2020


Ответы (1)


Вам нужно иметь указание, должна ли GroupC соответствовать чему-то или нет.

В комментариях вы сказали, что это может быть определено совпадающим значением для GroupB: если оно равно N/A, то GroupC не должна захватывать символы. Это вы можете сделать с негативным взглядом сзади.

Заменять

((?<groupC>.*?):)?

...с:

((?<!N\/A:)(?<groupC>.*?):)?
person trincot    schedule 18.12.2020