我正在尝试构建一个正则表达式来查找字符串中的所有函数调用。例如:
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()
部分
到目前为止,我可以使用this创建一个匹配内部引号的正则表达式:
'/' .
'(?:\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\')' . // single quoted string
'|' . // or
'(?:"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")' . // double quoted string
'/s';
我需要的是一个正则表达式,它将匹配上述正则表达式\w\s*\(
澄清我正在尝试匹配任何上面带有“是”的内容
我将如何编写这样的正则表达式?
答案 0 :(得分:2)
我同意上面关于tokenizer的评论,但是你可以通过正则表达式实现这一目标。
首先,php允许外观,所以你可以只匹配之前没有 a'或“:
的\w\s*\(
(?<!["'])\b\w+\s*\(
(?<!["'])
表示“前面没有"
或'
”。
\b
意味着我们应该匹配整个函数名称,而不是从中间开始。
要将此转换为php语法,我认为你加倍反斜杠(额外的反斜杠 - 逃避总是让我感到困惑):
'/(?<!["\'])\\b(\\w+)\\s*\\(/s'
另请注意,由于\w
为[0-9a-zA-Z_]
,因此会匹配2()
。它也会匹配引号内的no
中的"asdf no()"
,因为'
之前没有"
或no
。
在这种情况下,你可以另外指定在结束括号后没有引号,如下所示:
(?<!["'])\b\w+\s*\([^)]+\)(?!'")
其中(?!'")
表示“未跟'
或"
”。
这引入了一组新问题,例如,如果函数调用中包含嵌套括号(matchme('(asdf)')
不匹配)。您可以继续调整和调整正则表达式,例如这些情况,但总会有一些东西会破坏正则表达式,最后,更容易使用标记器或解析器。