1

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

我想匹配之间的任何东西''

我工作的表达式(?<=\$table_prefix(\s{2}=\s\'))(.*)?(?=\')不是很好,因为环视与=. 如果配置文件更改为两边的多个空格,=则表达式将不起作用。

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

有人可以简要解释一下进行这场比赛的更优雅的方式吗?

4

2 回答 2

0

这是一个可能的解决方案,使用grep. 它不是很优雅,但如果您关心=.

由于 AFAIK 中不允许可变长度断言grep,我唯一能想到的就是分两个阶段执行提取:

grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | grep -oP '(?<='"'"').*'

我基本上是捕获第一个周围的所有空格=,以及 . 'wp5t3s1tc_,然后提取 . 之后的所有内容'。奇怪'"'"'的是转义单引号字符。

或者您可以使用sed而不是第二个grep

grep -oP '(?<=\$table_prefix).*(?='"'"')' file_name | sed 's/ *= *'"'"'//'

于 2012-05-03T06:02:34.017 回答
-1

只要保证 ' 字符不会出现在您尝试匹配的序列中,您根本不需要使用环视。您可以将贪婪搜索与互补正则集一起使用,这将导致有限自动机贪婪地匹配任何不包含 ' 字符的字符串。

要仅解析单引号中的子序列,请使用命名组(如果您的引擎不支持,则使用未命名组。在这种情况下,您必须通过组的索引而不是给定名称来访问组)。这个正则表达式可以满足您的需求:

\$table_prefix\s*=\s*'(?<match>[^'.]*)';

检查http://rubular.com/

于 2012-05-02T18:19:57.417 回答