【问题标题】:more robust regular expression lookaround更健壮的正则表达式环视
【发布时间】:2012-05-02 18:02:39
【问题描述】:

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

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

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

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

有人能简单地解释一下进行这种匹配的更优雅的方式吗?

【问题讨论】:

    标签: regex lookaround


    【解决方案1】:

    这是使用grep 的可能解决方案。它不是很优雅,但如果您关心= 周围的可变空间,它应该是健壮的。

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

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

    我基本上首先捕获= 周围的所有空格,以及'wp5t3s1tc_,然后提取' 之后的所有内容。诡异的'"'"' 是转义单引号字符。

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

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

    【讨论】:

    • 非常感谢您。我自己永远也想不通!
    【解决方案2】:

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

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

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

    检查http://rubular.com/

    【讨论】:

    • 不,除非你能绝对保证它是同一个正则表达式引擎,否则不要检查网络事物。
    • 他没有提到他正在使用的正则表达式引擎。更重要的是,我使用的所有东西几乎都在所有新正则表达式的标准定义中。这些适用于 .NET、Java、Ruby、新的 Perl 正则表达式 ...
    • 不,这不是真的。例如,您需要 Java v7 和 Perl v5.10 来运行它们。始终测试您将要使用的工具使用该工具而不是其他工具
    • @alan 我是 mac osx 中的终端,我认为这是 Perl 风格。我只是对终端不满意。我将尝试使用 grep 命令运行测试。
    • @tchrist - 非常有效的观点。我对终端还没有那么自信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多