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

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

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

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

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

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

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

2742 次点击
所在节点    PHP
30 条回复
Kasumi20
2022-03-18 16:30:52 +08:00
/print\((.*)\);/
honkew
2022-03-18 16:31:19 +08:00
来个大神看看, 别沉了啊
honkew
2022-03-18 16:31:59 +08:00
@Kasumi20 结尾不一定是); 可能是)
MooRider
2022-03-18 16:32:32 +08:00
那就加个?呗, 0 个或 1 个
honkew
2022-03-18 16:34:05 +08:00
@MooRider 呃,重点要保证括号是成对的,不能确定有多少个 )
liuhan907
2022-03-18 16:38:32 +08:00
@honkew
括号不是可以正则匹配的。
theoda
2022-03-18 16:38:39 +08:00
@honkew 举个不成对的例子呢
cpstar
2022-03-18 16:45:33 +08:00
OP 得多提供几种用于匹配的字符串,单独这一个,很多情况无法覆盖
constexpr
2022-03-18 16:47:49 +08:00
这个需要支持递归的正则了, 不建议用正则
samv2
2022-03-18 17:17:45 +08:00
print\((.+)\)[^)]?

分组取$1
imdong
2022-03-18 17:23:20 +08:00
\)$ 呢?
darklights
2022-03-18 18:17:11 +08:00
9 楼正解,要用递归模式,然而我不会。
PHP 也支持,文档:www.php.net/manual/en/regexp.reference.recursive.php 。只能帮到这了。
说实话,用正则解决这类问题不如 PEG 直观。
GeruzoniAnsasu
2022-03-18 18:42:49 +08:00
经典正则 vs 括号配对


正则表达式无法匹配成对的括号。 搜索关键词: 泵引理 ( Pumping lemma )
jfcherng
2022-03-18 18:51:21 +08:00
總覺得追加的測試用例和原文給的測試用例並不存在相同規則。
樓主追加的測試用例並不符合最一開始說的「需要匹配 print 中间的内容」
jfcherng
2022-03-18 18:52:44 +08:00
print(\(((?>[^()]+)|(?-2))*\)) 符合追加內容,但不符合最一開始給的例子
honkew
2022-03-18 19:06:33 +08:00
@jfcherng 是我没有表达清楚 大概意思就是匹配 print() 中的内容但是里面的括号要成对出现直到结束,里面的括号数量未知

print(()) 对的
print(print()) 对的
print(print(),()) 对的
print(print(),()()) 对的
GuuJiang
2022-03-18 19:18:35 +08:00
参见我在 https://v2ex.com/t/820095#reply6 里的回答
正则表达式不是万能的,只能匹配正则语言,而非正则语言中最经典的一个例子就是成对的括号
自己老老实实用个栈来做吧,比正则表达式简单多了
jfcherng
2022-03-18 19:19:15 +08:00
@honkew 簡單來說

為什麼是返回 print(print().print())
而不是返回 print(print(print().print()))
jfcherng
2022-03-18 19:21:02 +08:00
如 #12 所說,PHP 用的正則是可以遞歸的,所以可能有解,例如我給出的 #15 。但我沒看出 LZ 結果的規則。
honkew
2022-03-18 19:22:15 +08:00
@jfcherng 对,应该是 print(print(print().print()))

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

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

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

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

© 2021 V2EX