【问题标题】:Regexp for handling recursive arguments用于处理递归参数的正则表达式
【发布时间】:2011-01-26 17:21:48
【问题描述】:

我是一个正则表达式新手,所以我想知道下面的正则表达式是什么:

函数{函数 arg1, arg2}, arg3

我希望能够只选择顶级参数:{function arg1, arg2} & arg3

理想情况下,响应将在 PHP 中使用 preg_match,但几乎任何正则表达式都可以正常工作。

谢谢! 马特

【问题讨论】:

  • 这是您需要的最通用的函数形式吗?内部函数中是否总是有两个参数?
  • 如果你在参数中允许任意深度的函数 (function … {function … {function …} … } … }),你的语言不是正则的,你不能使用正则表达式来解析它。
  • 使用 pcre 的递归模式语法,可以test 语句。但是afaik(最大)捕获数是在编译时确定的,即您可以获取第一个顶级参数+完整的尾部或(不太有用)第一个和最后一个顶级参数(因为后面的抓取会覆盖之前抓取的相同捕获)。
  • @Gumbo:PCRE 等(在这种情况下当然是“正则表达式”)允许您匹配非常规语言(并且已经这样做了很长时间)。我猜你知道这一点,所以我不知道为什么所有关于“正则表达式不能匹配非正则语言”的大惊小怪。
  • @Qtax:说实话,我不知道 PCRE 确实支持递归模式。感谢您提供这些信息。

标签: php regex


【解决方案1】:

PCRE/Perl 正则表达式,但我只是猜测您想要什么(取决于以下规格):

/(?:function\s+|\G(?<!^),\s*)([^,{}]+|\{function\s+(?1)\s*(?:,\s*(?1)\s*)*})\s*/g

示例 Perl 使用:

test('function {function arg1, arg2}, arg3');
test('function foo, {function {function x}, y}, bar');

sub test{
    print 'Matched: "', join '", "',
        $_[0] =~
        /(?:function\s+|\G(?<!^),\s*)
        (
            [^,{}]+
            |
            \{function\s+(?1)\s*(?:,\s*(?1)\s*)*}
        )
        \s*/gx;
    print "\"\n";
}

输出

Matched: "{function arg1, arg2}", "arg3"
Matched: "foo", "{function {function x}, y}", "bar"

PHP 中应该可以正常工作,只需在需要的地方转义并与 preg_match_all 一起使用。

关于规范的很多问题:

  • 您要匹配的字符串是否包含除此之外的其他内容?
  • 总是有两个参数吗?
  • 论据是否只有一个词?
  • “函数”是关键字还是函数名?

请提供更多(真实)示例!

【讨论】:

  • 感谢您试一试 - 不幸的是我无法让它工作。
  • 我们可以提供更多(真实)示例来说明您想在这里做什么吗?
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多