1

我正在尝试构建一个正则表达式来查找字符串中的所有函数调用。例如:

 No No       No       No         Yes       Yes        No DOT YES   NO    YES
 |  |        |        |           |         |         |   |   |     |      |
(1, 2, 3 * (1/4), 'somestr()', findme(), andme ( ), 'and' . me(), NTME, me(0) )

   No        No          No
   |         |           |
(CONST, 'some"q()', "nop\"no()")

字符串将始终采用参数列表 eq => 的格式(a,b,c...)

请注意,在'and' . me()它的情​​况下应该只匹配me()部分

到目前为止,我能够使用来创建一个匹配引号内任何内容的正则表达式:

'/' . 
    '(?:\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\')' .      // single quoted string
        '|' .                                       //   or
    '(?:"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")' .          // double quoted string
'/s';

我需要的是一个正则表达式,它将匹配上述正则表达式中没有的任何内容\w\s*\(

为了澄清我正在尝试匹配上面有 Yes 的任何东西

我将如何编写这样的正则表达式?

4

1 回答 1

2

我同意上面关于标记器的评论,但这里是你可以如何使用正则表达式来实现这一点。

首先,php允许环视,所以你可以匹配\w\s*\(前面没有'或"的:

(?<!["'])\b\w+\s*\(

(请参阅此处的交互式正则表达式

The(?<!["'])表示“前面没有"or '”。这\b意味着我们应该匹配整个函数名而不是从中间开始。

要将其转换为 php 语法,我认为您将反斜杠加倍(额外的反斜杠转义总是让我感到困惑):

'/(?<!["\'])\\b(\\w+)\\s*\\(/s'

另外,请注意,因为\wis [0-9a-zA-Z_],这将匹配2()。它也将匹配noin "asdf no()"which is inside 引号,因为没有'"紧接在no.

在这种情况下,您可以另外指定右括号没有引号,如下所示:

(?<!["'])\b\w+\s*\([^)]+\)(?!'")

其中(?!'")“不跟随'"”。

这引入了一组新问题,例如,如果您的函数调用中有嵌套括号(matchme('(asdf)')不匹配)。对于此类情况,您可以继续调整和调整正则表达式,但总会有一些东西会破坏正则表达式,最后,使用标记器或解析器更容易

于 2013-02-26T03:10:11.563 回答