Группа регулярных выражений не начинается с

У меня возникли проблемы с вычислением 2 регулярных выражений в одном (используется для работы с файлами .ini)

У меня есть этот (предлагаю вам использовать rubular с этими примерами, чтобы понять)

^(?<key>[^=;\r\n]+)=((?<value>\"*.*;*.*\"[^;\r\n]*);?(?<comment>.*)[^\r\n]*)

соответствовать:

  • Это="не;комментарий"
  • This="isa";комментарий
  • This="isa;особый";случай

А у меня вот такой:

^(?<key>[^=;\r\n]+)=(?<value>[^;\r\n]*);?(?<comment>[^\r\n]*)

соответствовать

  • Это=простой случай
  • Это=просто;комментарий

И я пытаюсь объединить 2 регулярных выражения, к сожалению, мне не удается сказать: «Если моя группа значений не начинается с \», используйте второе, если не используйте первое».

Прямо сейчас у меня есть это:

^(?<key>[^=;\r\n]+)=(((?<value>\"*.*;*.*\"[^;\r\n]*);?(?<comment>.*)[^\r\n]*)|(?<value>[^;\r\n]*);?(?<comment>[^\r\n]*))

Но он создает еще 2 безымянных раздела для простого случая без кавычек. Я подумал, что, возможно, добавив «первый элемент группы значений для простого случая не должен начинаться с \». Но мне это не удалось.

PS: Я предлагаю вам использовать rubular, чтобы лучше понять мою проблему. Извините, если я был недостаточно ясен


person naurel    schedule 21.11.2014    source источник


Ответы (1)


Как насчет этого?

^(?<key>[^=;\r\n]+)=(?<value>"[^"]*"|[^;\n\r]*);?(?<comment>.*)

ДЕМО

  • (?<key>[^=;\r\n]+) Соответствует части перед символом =.
  • "[^"]*" Соответствует строке в двойных кавычках, например, таким строкам, как "foobar". Если " нет, то механизм регулярных выражений переходит к следующему шаблону, который равен [^;\n\r]*, и он соответствует первому символу ; или новой строки или \r. Эти совпадающие символы сохраняются в именованной группе с именем value.
  • ;? Необязательная точка с запятой.
  • (?<comment>.*) Остальные символы сохраняются в группе comment.
person Avinash Raj    schedule 21.11.2014
comment
Спасибо, братан, но это не работает с: This=isa;special;case. Для этого у нас должно быть: ‹key›Это‹значение›является;особым‹комментарием›случай, вот почему у меня так много проблем. Если есть ; внутри цитаты это не должно быть обнаружено как комментарий. - person naurel; 21.11.2014
comment
Благодарю вас ! Идеально. Можете ли вы объяснить мне, как вы создали регулярное выражение? Я хотел бы научиться думать, чтобы строить такие вещи. - person naurel; 21.11.2014