Сделайте это в три этапа.
- Разделить на
;
, чтобы разделить выписки.
- Разделите пару ключ/значение на
=
.
- Сделка с цитированием значения.
Вот пример.
def get_value(line)
# Split into statements
statements = line.split(/\s*;\s*/)
# Extract the value of the 2nd statement
_,value = statements[1].split(/\s*=\s*/)
# Strip the quotes
value.gsub!(/^(['"]?)(.*)\1$/, '\2')
return value
end
Есть несколько случаев с краями, которые не обрабатываются: что, если заявление, которое вас интересует, не второе? Но это может быть исправлено по мере необходимости. Гораздо легче улучшить ваш синтаксический анализ, когда это делается несколькими шагами, а не пытаться втиснуть его в одно регулярное выражение.
Например, это правильно обрабатывает встроенные и экранированные котировки, такие как %q[inline; filename="name's.extension"]
и %q[inline; filename="name's.\\"extension\\""]
.
Если вы действительно хотите сделать это как одно регулярное выражение, хорошо, вы его попросили.
re =/
\bfilename
\s*=\s*
(?:
(?<quote>['"])(?<value>.*)\k<quote> |
(?<value>[^;]+)
)
/x
return re.match(line)['value']
Это разделяет обработку удлинителя на две альтернативы: одна с кавычками и одна без. В противном случае filename=name.ext;
подберет точку с запятой, и я не смогу найти другой способ остановить ее, что не приведет к новой проблеме.
Например, /\bfilename\s*=\s*(?<quote>['"]?)(?<value>.*?)\k<quote>;?$/
будет работать с тестовыми данными, но тогда это не удастся, если после точки с запятой есть что-то вроде %q[inline; filename='name.extension'; foo]
.
Вы запросили экспертное знание регулярного выражения. Частью эксперта по регулярному выражению является знать, когда вы не должны использовать регулярное выражение. Это, вероятно, должно быть обработано грамматикой, или вы будете постоянно преследовать краевые случаи.
Ни один из ответов пока не идентифицирует несбалансированные кавычки, такие как одиночная кавычка раньше и без цитат. Вы хотите, чтобы метод подтвердил, что цитата, если она присутствует, сбалансирована? –
Собственно, это будет вишня на торте :-) – Whyves
В определенный момент вам нужна грамматика. – Schwern