询问一个正则的非贪婪写法

2017-12-26 00:14:17 +08:00
 tempdele

文本内容如下 aaa (bbb) (ccc(dd)cc) 需要的是()及其之中的内容,但之中的内容至少有 3 个字符, 即结果需要是

1, (bbb)
2, (ccc(dd)cc)

目前我的规则是"(.+?)"

但这样的结果只能把 (bbb) 正确取出, 其余的部分就只能取到 (ccc(dd) 就结束了, 各位有什么建议吗? 谢谢

FYI1, 最后的)不一定在句末, 有可能后面还有字符
FYI2, 多个(.+)之间可能还有字符
1566 次点击
所在节点    问与答
5 条回复
iEverX
2017-12-26 00:34:09 +08:00
问号去掉不行吗?
freedomSky
2017-12-26 00:35:41 +08:00
➜ tmp cat data
(bb)
(bbb)
(bbbb)
(ccc(dd)cc)
xxxx)xxxxx(ccc(ddcc)xxx(x
➜ tmp sed -n 's/[^(]*(\(.\{3,\}\)).*/\1/p' data
bbb
bbbb
ccc(dd)cc
ccc(ddcc

不记得什么是贪婪不贪婪了:)
geelaw
2017-12-26 00:55:44 +08:00
你先得告诉我为什么(ccc(dd)不是你期待的结果

那你期待(bbb) (ccc(dd)ccc)成为结果吗?

简单来说,你是否希望匹配里扔掉非左右小括号之后是完美的括号序列?如果是,那么正则表达式做不到,至少计算机科学意义上的正则表达式做不到,因为你期待的匹配组成的语言不是正则语言。

不排除有些引擎可以做到,比如支持反向引用的引擎可以识别 1^n 0 1^n (不是正则语言),但我认为通常所见的引擎不支持你的想法。
geelaw
2017-12-26 00:57:08 +08:00
@geelaw *更正:扔掉非左右小括号之后是合法括号序列且不能写成两个非空子串的连接,且这两个非空字串都是合法括号序列。
gamexg
2017-12-26 09:28:43 +08:00
(\(.+\))

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

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

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

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

© 2021 V2EX