小白问一个正则匹配的问题

2022-03-18 16:20:19 +08:00
 honkew

小白问一个正则匹配的问题

print(print(print().print()));

需要匹配 print 中间的内容 print(print().print())

需要保持括号成对的 小括号的数量未知!

是不是用分组能解决,但我不知道该怎么做

2742 次点击
所在节点    PHP
30 条回复
jfcherng
2022-03-18 19:22:26 +08:00
當然以後你可能也不知道當初自己的正則到底在寫什麼 (狗頭
jfcherng
2022-03-18 19:24:24 +08:00
@honkew #20 那你用 $15 那個就行了。不過字串裡有不成對的括號就炸了
honkew
2022-03-18 19:28:37 +08:00
@jfcherng 貌似可以耶,我学习下这个
lujjjh
2022-03-18 19:38:57 +08:00
正确的回答是,这个问题不适合用正则表达式解决。

> Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. - Jamie Zawinski
iqfEmhuNidBhDfWo
2022-03-18 20:25:24 +08:00
看起来骏马金龙博客的“分组命名捕获”可以满足你的需求,这博主我是真佩服
shyrock
2022-03-18 22:16:43 +08:00
@darklights #12 PEG 是啥?
darklights
2022-03-18 22:26:42 +08:00
@shyrock Parsing Expression Grammar 解析表达文法
xiangyuecn
2022-03-19 00:14:31 +08:00
print(")text( ((( )))))))(((((())))", (1+1+(1+1))) 神仙难救
LeeReamond
2022-03-19 11:42:34 +08:00
@lujjjh 粗看下题设未脱离状态机可解决的范畴
lujjjh
2022-03-19 14:53:43 +08:00
@LeeReamond 有限状态机无法解决括号匹配问题,需要有无限个状态(不在括号里、在一对括号里、在两对括号里……)。某些语言里的正则可能有一些特有特性能解决这种递归 /平衡的问题,但括号匹配仍不属于常规意义里的正则语言。

OP 实际上提出了一个 XY problem ,可以预见的是,即便是顺着思路强行用正则实现,仍然会出现 BUG 。因为这里的状态不只是括号,还有是否在字符串里、是否在注释里等等。我猜测 OP 真正需要的是一个完备的 PHP parser ,但最终想实现什么不得而知。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841301

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX