print(print(print().print()));
需要匹配 print 中间的内容 print(print().print())
需要保持括号成对的 小括号的数量未知!
是不是用分组能解决,但我不知道该怎么做
![]() |
1
Kasumi20 149 天前
/print\((.*)\);/
|
2
honkew OP 来个大神看看, 别沉了啊
|
![]() |
4
MooRider 149 天前
那就加个?呗, 0 个或 1 个
|
![]() |
8
cpstar 149 天前
OP 得多提供几种用于匹配的字符串,单独这一个,很多情况无法覆盖
|
![]() |
9
constexpr 149 天前
这个需要支持递归的正则了, 不建议用正则
|
10
samv2 149 天前
print\((.+)\)[^)]?
分组取$1 |
![]() |
11
imdong 149 天前 via iPhone
\)$ 呢?
|
12
darklights 149 天前
9 楼正解,要用递归模式,然而我不会。
PHP 也支持,文档:www.php.net/manual/en/regexp.reference.recursive.php 。只能帮到这了。 说实话,用正则解决这类问题不如 PEG 直观。 |
13
GeruzoniAnsasu 149 天前
经典正则 vs 括号配对
正则表达式无法匹配成对的括号。 搜索关键词: 泵引理 ( Pumping lemma ) |
![]() |
14
jfcherng 149 天前
總覺得追加的測試用例和原文給的測試用例並不存在相同規則。
樓主追加的測試用例並不符合最一開始說的「需要匹配 print 中间的内容」 |
![]() |
15
jfcherng 149 天前
print(\(((?>[^()]+)|(?-2))*\)) 符合追加內容,但不符合最一開始給的例子
|
16
honkew OP @jfcherng 是我没有表达清楚 大概意思就是匹配 print() 中的内容但是里面的括号要成对出现直到结束,里面的括号数量未知
print(()) 对的 print(print()) 对的 print(print(),()) 对的 print(print(),()()) 对的 |
17
GuuJiang 149 天前
参见我在 https://v2ex.com/t/820095#reply6 里的回答
正则表达式不是万能的,只能匹配正则语言,而非正则语言中最经典的一个例子就是成对的括号 自己老老实实用个栈来做吧,比正则表达式简单多了 |
![]() |
19
jfcherng 149 天前
如 #12 所說,PHP 用的正則是可以遞歸的,所以可能有解,例如我給出的 #15 。但我沒看出 LZ 結果的規則。
|
![]() |
21
jfcherng 149 天前
當然以後你可能也不知道當初自己的正則到底在寫什麼 (狗頭
|
![]() |
24
lujjjh 149 天前
正确的回答是,这个问题不适合用正则表达式解决。
> Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. - Jamie Zawinski |
25
iqfEmhuNidBhDfWo 149 天前
看起来骏马金龙博客的“分组命名捕获”可以满足你的需求,这博主我是真佩服
|
![]() |
26
shyrock 149 天前
@darklights #12 PEG 是啥?
|
27
darklights 149 天前
@shyrock Parsing Expression Grammar 解析表达文法
|
![]() |
28
xiangyuecn 148 天前
print(")text( ((( )))))))(((((())))", (1+1+(1+1))) 神仙难救
|
![]() |
29
LeeReamond 148 天前
@lujjjh 粗看下题设未脱离状态机可解决的范畴
|
![]() |
30
lujjjh 148 天前 ![]() @LeeReamond 有限状态机无法解决括号匹配问题,需要有无限个状态(不在括号里、在一对括号里、在两对括号里……)。某些语言里的正则可能有一些特有特性能解决这种递归 /平衡的问题,但括号匹配仍不属于常规意义里的正则语言。
OP 实际上提出了一个 XY problem ,可以预见的是,即便是顺着思路强行用正则实现,仍然会出现 BUG 。因为这里的状态不只是括号,还有是否在字符串里、是否在注释里等等。我猜测 OP 真正需要的是一个完备的 PHP parser ,但最终想实现什么不得而知。 |