Более надежное регулярное выражение

Это входная строка: $table_prefix = 'wp5t3s1tc_'; который является частью большего конфигурационного файла.

Я хочу сопоставить что-нибудь между ''

Выражение у меня работает (?<=\$table_prefix(\s{2}=\s\'))(.*)?(?=\') что не очень хорошо из-за хрупкого способа, которым lookaround работает с символом пробела по обе стороны от =, Если файл конфигурации изменяется с несколькими пробелами по обе стороны от = тогда выражение не будет работать.

Я думаю, это должно выглядеть как (?<=\$table_prefix(\s*\=\s*\'))(.*)?(?=\') но это, конечно, не работает.

Может ли кто-нибудь кратко объяснить более изящный способ проведения этого матча?

2 ответа

Решение

Вот возможное решение с использованием grep, Это не очень элегантно, но оно должно быть надежным, если вас интересуют переменные пространства вокруг =,

Поскольку утверждения переменной длины не допускаются в grepAFAIK, единственное, о чем я могу думать, - это выполнить извлечение в два этапа:

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/

Другие вопросы по тегам