作者CindyLinz (Cindy Wang)
看板RegExp
标题Re: [问题] 怎麽找第一个匹配的外括号内容
时间Thu Feb 10 12:07:55 2011
※ 引述《unlearn (我没你那麽坚强..)》之铭言:
: 层数不固定的巢状括号是否有办法找到外层匹配的括号?
: 举例:原字串为 "(a b c(d e f)(g))(h i)"
: pattern 要怎麽写才会同时 match 到(a b c(d e f)(g)) , (h i)
: abc..j 表示一般文字字串
: 想法:
: 原字串最多一层时,如: (h i) -> 可用 \([^()]*\)
: 原字串最多二层时,如: (a b c(d e f)(g)) -> 可用 \([^()]*(\([^()]*\))*[^()]*\)
: 但是如果今天原始字串不确定最多有几层(深)的括号
: patern要怎麽写才能判断正确?
如果是 perl 5.10 的 regex 可以用:
/\(([^()]|\((?1)*\))*\)/
中间的
(?1) 会去拿第一组 capture 去 match.
这一段程式
$a =
"(a b c(d e f)(g))(h i)(((123)))";
print $&,
$/ while(
$a =~
/\(([^()]|\((?1)*\))*\)/g );
会印出
(a b c(d e f)(g))
(h i)
(((123)))
不过根据原始数学上定义的 regex, 不能找这种不定深度的匹配..
perl 的 regex 已经不是 regex 了.. ^^|
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.242.246.249
1F:推 unlearn:我是用vb的RegExp,似乎也没有类似的用法,非常感谢解答 02/10 21:29
2F:推 godspeedlee:php 的 preg 也可以 02/17 22:29
3F:推 godspeedlee:另外 Ruby 有另一种解法,但是其实括号批配的演算法 02/17 22:56
4F:→ godspeedlee:并不难就是了 02/17 22:56
※ 编辑: CindyLinz 来自: 210.242.246.249 (09/10 13:16)