2010-03-12 96 views
0

我是一个正则表达式新手,所以我想知道什么是正则表达式为以下几点:正则表达式处理递归参数

功能{功能ARG1,ARG2},ARG3

我m看起来能够只选择顶级参数:{function arg1,arg2} & arg3

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

谢谢! 马特

+0

这是您需要的最普通的功能形式吗?在内部函数中总是有两个参数? – Jens 2010-03-12 07:06:53

+4

如果你在参数('function ... {function ... {function ...} ...}})中允许任意深度的函数,那么你的语言是不规则的,你不能用正则表达式来解析它。 – Gumbo 2010-03-12 07:09:55

+2

使用pcre的递归模式语法可以_test_语句。但是,最大数量的捕获是在编译时确定的,也就是说,您可以获取第一个顶级参数+完整尾部或第一个和最后一个顶级参数(不是很有用)因为之后的提取会覆盖先前提取的相同捕获)。 – VolkerK 2010-03-12 08:04:37

回答

0

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即可。

许多有关规范寿的问题:

  • 请问你是匹配的字符串包含任何东西比这个?
  • 总是有两个参数吗?
  • 参数只有一个单词吗?
  • “功能”是关键字还是功能名称?

请更多(真实)例子!

+0

感谢您参加此活动 - 不幸的是,我无法使其工作。 – Matt 2010-03-18 06:28:20

+0

我们可以有更多(真实的)你想要做什么的例子吗? – Qtax 2010-03-18 16:06:43