Более надежное регулярное выражение
Это входная строка: $table_prefix = 'wp5t3s1tc_';
который является частью большего конфигурационного файла.
Я хочу сопоставить что-нибудь между ''
Выражение у меня работает (?<=\$table_prefix(\s{2}=\s\'))(.*)?(?=\')
что не очень хорошо из-за хрупкого способа, которым lookaround работает с символом пробела по обе стороны от =
, Если файл конфигурации изменяется с несколькими пробелами по обе стороны от =
тогда выражение не будет работать.
Я думаю, это должно выглядеть как (?<=\$table_prefix(\s*\=\s*\'))(.*)?(?=\')
но это, конечно, не работает.
Может ли кто-нибудь кратко объяснить более изящный способ проведения этого матча?
2 ответа
Вот возможное решение с использованием grep
, Это не очень элегантно, но оно должно быть надежным, если вас интересуют переменные пространства вокруг =
,
Поскольку утверждения переменной длины не допускаются в grep
AFAIK, единственное, о чем я могу думать, - это выполнить извлечение в два этапа:
grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | grep -oP '(?<='"'"').*'
Я в основном захватил все пространства вокруг =
во-первых, наряду с 'wp5t3s1tc_
и затем извлекать все после '
, Странный '"'"'
это избежать одиночной кавычки.
Или вы могли бы использовать sed
вместо второго grep
:
grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | sed 's/ *= *'"'"'//'
Вам вообще не нужно использовать lookaround, пока вы гарантированно не увидите, что символ 'не появится в последовательности, которую вы пытаетесь сопоставить. Вы можете использовать жадный поиск с дополнительным регулярным набором, что приведет к конечным автоматам, которые будут жадно сопоставлять любую строку, которая не будет содержать символ '.
Чтобы проанализировать только подпоследовательность в одинарных кавычках, используйте именованные группы (или неназванные группы, если ваш движок не поддерживает это. В этом случае вам придется обращаться к группе по ее индексу, а не по имени). Это регулярное выражение делает то, что вы ищете:
\$table_prefix\s*=\s*'(?<match>[^'.]*)';
Проверьте с http://rubular.com/