Нужно регулярное выражение для синтаксического анализа keyword='value' с одинарными или двойными кавычками
-
12-09-2019 - |
Вопрос
У меня возникли проблемы с написанием регулярного выражения (подходит для функции preg_match в PHP ()), который анализирует пары ключевое_слово= "значение" независимо от того, <value> строка заключена в одинарные или двойные кавычки.IOW в обоих следующих случаях мне нужно получить <name> и <value> где <value> строка может содержать не заключающий тип кавычек:
name="value"
name='value'
Решение
В Perl это регулярное выражение, которое будет работать.Сначала он соответствует началу строки, затем соответствует одному или нескольким символам, отличным от =, и присваивает им значение $ 1.Затем он ищет скобки =, затем a без круглых скобок с выбором соответствия для " или " и устанавливает это значение равным $ 2.
/^([^=]+)=(?:"([^"]+)"|'([^']+)')$/
Если вы хотели, чтобы он соответствовал пустым выражениям типа.
Это=""
Замените последние два + на *, иначе это должно сработать
Редактировать Как упоминалось в комментариях.Дуг использовал...
/^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/
Это будет соответствовать одному необязательному пробелу в конце ввода или значения, и он удалил маркер конца строки.
Другие советы
/^(\w+?)=(['"])(\w+?)\2$/
Который поместит ключ в $1
и ценность в $3
.
С опозданием на несколько лет, но поскольку этот вопрос занимает высокое место в Google, а ответы не удовлетворили мои потребности, вот еще один выражение:
(?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2
Это будет соответствовать одинарным или двойным кавычкам, принимая во внимание экранированные кавычки и значения без кавычек.
name = bar
name = "bar"
name = 'bar'
name = "\"ba\"r\""
У него, однако, есть ограничение в том, что если значение отсутствует, считывается ключ из следующей пары ключ / значение.Это может быть устранено с помощью список , разделенный запятыми из пар ключ/значение.