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