作者gugod (啊)
看板Perl
标题Re: [问题] 请教一个关於正规表示式的问题
时间Sat Dec 18 00:21:23 2010
※ 引述《AutumnVic (小点点雨伞儿)》之铭言:
: 我现在要做的事
: 是要从很多像这样的字串中
: ((((((.(((.((((..((((...........))))..)))))..........))...))))))...
: ........(((((..(((((((..(((.....)))))..))......)))))..)))...
: 挑出中间部份 "(.....)"的左括和右括分别位在字串中的第几个字元
: 下面是我的CODE
: my $haha="....((((((...(((..((.(.(((((.....))))).))...)))))))...)))..";
: print length($1) if( $haha =~ m/(.*)[^\(]*? /)
: 但他这样取到的一直都是整个字串的length
: 而不是我想要的"中间左括"的位子
: 能不能请厉害的人帮我一下 实在不知道该怎麽拆解找这两个东西 @@
不是很确定所谓的「中间部份」指的是什麽状况... 也许要再更仔细定义一些。
以下用 $position 表示所要的结果。
如果已经知道要找的字串是什麽,例如说 "(abcde)",那用 index:
$position = index $haha, "(abcde)";
如果要找的是「在碰到第一个 ")" 的最後一个 "("」,大约是这样的 regex:
$haha =~ /(^.+[^)]+?)(\([^(]+?\))/s;
$position = length $1;
如果括号如范例,不会有交错出现,同一层也不会有多组,那
这解法也会「找到最内层的那一组小括号」。
一层有多组括号指的是像这样:
"....((((.)(...)....(...))(..))..."
-1-==2== --3--
同一层内有三组括号。
如果最终的目的是要正确的解析括号对应关系,其不要用 regex,直接用
Text::Balanced 模式,regex 不足以处理递回结构的字串解析。
用已经写好的模组比较正确。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.222.155
1F:推 abliou:推一下 12/18 11:13
2F:→ AutumnVic:我有事先处理所以都只有一组括号~谢谢你的说明 =) 12/20 09:45