让为C#创建的正则表达式模式在PHP中工作


Making a regex pattern created for C# work in PHP

我在stackerflow上找到了以下答案,其中描述了如何使用正则表达式模式从字符串中提取(嵌套)函数和参数。

用户还提供了一个模式应该工作的示例,在他从最外部的函数中提取参数(在php中也可以很好地工作)后,他匹配以下文本

a,b,func1(a,b+c),func2(a*b,func3(a+b,c)),func4(e)+func5(f),func6(func7(g,h)+func8(i,(a)=>a+2)),g+2

具有以下模式

(?:[^,()]+((?:'((?>[^()]+|'((?<open>)|')(?<-open>))*(?(open)(?!))')))*)+

下面的(更简单的)模式也应该适用于

(?:[^,()]+((?:'((?>[^()]+|'((?<open>)|')(?<-open>))*')))*)+

注意,用户使用C#作为他的例子,我想让它在PHP中工作,但我无法做到

因此,当我尝试使用preg_match($pattern, $string, $matches)匹配示例String时,它不会返回任何匹配项。

如果我在regex101上输入模式和示例,它会给我错误,我无法修复它们(我想这与模式的<open>部分有关)。

我在regex方面不是最好的,所以有人能帮我,告诉我我需要改变什么模式才能使用php吗?

PHP使用PCRE正则表达式引擎来实现其preg_*函数。PCRE可以使用递归匹配嵌套模式,而.NET则使用不同的方法:平衡组。这两种口味之间还有其他主要区别。

因此,您想要实现的目标肯定是可能的,但需要完全重写regex,因为这两种方法完全不同。

以下是PCRE(带gx)的翻译:

(?:
  [^,()]++         # match a function name
  (?<args>         # open the "args" group
    '(             # opening parenthesis
    (?:
      [^()]++      # match anything but parentheses
      | 'g<args>   # or recurse into "args", make sure the parentheses are balanced
    )*+
    ')             # closing parenthesis
  )*+
)+

演示

或者,以较短的形式:

(?:[^,()]++(?<args>'((?:[^()]++|'g<args>)*+'))*+)+