更强大的正则表达式外观

时间:2012-05-02 18:02:39

标签: regex lookaround

这是输入字符串:$table_prefix = 'wp5t3s1tc_';,它是较大配置文件的一部分。

我希望匹配''

之间的任何内容

我工作的表达式是(?<=\$table_prefix(\s{2}=\s\'))(.*)?(?=\'),这并不是很好,因为外观与=两侧的空白字符一起使用的方式很脆弱。如果配置文件在=的任一侧以多个空格更改,则表达式将无效。

我认为它看起来应该更像(?<=\$table_prefix(\s*\=\s*\'))(.*)?(?=\'),但这当然不起作用。

有人可以简单地解释一下这种比赛更优雅的方式吗?

2 个答案:

答案 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>[^'.]*)';

查看http://rubular.com/