Re: [問題] 請教一個關於正規表示式的問題
※ 引述《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
推
12/18 11:13, , 1F
12/18 11:13, 1F
→
12/20 09:45, , 2F
12/20 09:45, 2F
討論串 (同標題文章)