这是输入字符串:$table_prefix = 'wp5t3s1tc_';
,它是较大配置文件的一部分。
我希望匹配''
我工作的表达式是(?<=\$table_prefix(\s{2}=\s\'))(.*)?(?=\')
,这并不是很好,因为外观与=
两侧的空白字符一起使用的方式很脆弱。如果配置文件在=
的任一侧以多个空格更改,则表达式将无效。
我认为它看起来应该更像(?<=\$table_prefix(\s*\=\s*\'))(.*)?(?=\')
,但这当然不起作用。
有人可以简单地解释一下这种比赛更优雅的方式吗?
答案 0 :(得分:0)
这是使用grep
的可能解决方案。它不是很优雅,但如果您担心=
周围的变量空间,它应该是健壮的。
由于grep
,AFAIK中不允许使用变长断言,我唯一能想到的就是分两个阶段进行提取:
grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | grep -oP '(?<='"'"').*'
我基本上首先捕获=
周围的所有空格以及'wp5t3s1tc_
,然后在'
之后提取所有空格。奇怪的'"'"'
是逃避单引号字符。
或者您可以使用sed
代替第二个grep
:
grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | sed 's/ *= *'"'"'//'
答案 1 :(得分:-1)
只要您确保'字符不会出现在您尝试匹配的序列中,就不需要使用环视。您可以使用具有互补规则集的贪婪搜索,这将导致有限自动机将贪婪地匹配任何不包含'字符的字符串。
要仅解析单引号中的子序列,请使用命名组(如果您的引擎不支持,则使用未命名的组。在这种情况下,您必须通过它的索引而不是给定名称来访问该组)。 这个正则表达式符合您的要求:
\$table_prefix\s*=\s*'(?<match>[^'.]*)';