亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 正則表達(dá)式無法生效 [打印本頁]

作者: wind_ch    時間: 2009-12-24 10:37
標(biāo)題: 正則表達(dá)式無法生效
http://www.a.com//file//index.html 轉(zhuǎn)換成正常的, 有人提供如下方法:
@urls=qw(
        http://www.a.com/file/in.html
        http://www.a.com//big-dash-dash/in.html
        );

foreach (@urls){
  m#^[^/]//#;                 
  s#\G//#/#g;
  print $_,"\n";
}


但我自己運行都不好用, 而且我覺得應(yīng)該吧 m#^[^/]//# 寫成 m#^[^/]+?//#, 也不行.
是什么原因呢?
作者: blackold    時間: 2009-12-24 11:17
foreach (@urls) {
  s#(?<!:)//#/#g;
  print "$_\n";
}
作者: wind_ch    時間: 2009-12-24 15:12
黑哥的方法是生效的,  
s#([\-\.\w]+)//#$1/#g; 也可以. (作者提供的另一種方法)

但按作者的意圖, 他想在匹配到第一個//之後, 再把後面的//替換掉.
但是\G好像起不到作用.

我現(xiàn)在郁悶的是, 我不知道是他勘誤, 還是我運行的環(huán)境不對頭, 而且, 按他的思路, 我看他程序都不對.

[ 本帖最后由 wind_ch 于 2009-12-24 15:15 編輯 ]
作者: wind_ch    時間: 2009-12-25 17:16
Happy Christmas! 並且拿鏈接頂一下
http://stason.org/TULARC/webmaster/myfaq.html#2
作者: blackold    時間: 2009-12-25 17:26
標(biāo)題: 回復(fù) #3 wind_ch 的帖子
那樣寫肯定是錯誤的嘛。

要修改。
作者: wind_ch    時間: 2009-12-25 18:00
我改成自認(rèn)為正確的也不行.

"吧 m#^[^/]//# 寫成 m#^[^/]+?//#, 也不行."

另外上面給的鏈接, 新人可以學(xué)一哈.
作者: yybmsrs    時間: 2009-12-25 18:03
原帖由 wind_ch 于 2009-12-24 15:12 發(fā)表
黑哥的方法是生效的,  
s#([\-\.\w]+)//#$1/#g; 也可以. (作者提供的另一種方法)

但按作者的意圖, 他想在匹配到第一個//之後, 再把後面的//替換掉.
但是\G好像起不到作用.

我現(xiàn)在郁悶的是, 我不知道是他 ...


我運行出來的結(jié)果:
http://www.a.com/file/in.html
http://www.a.com//big-dash-dash/in.html

是沒改變
作者: wind_ch    時間: 2009-12-25 18:13
其實黑哥的方法也不錯了, 而且還好記。
但是作者提供的兩種方法中說一個比另一個的效率高很多。而那個高效的方法我卻不能跑!

黑哥(s#(?<!: )//#/#g; )
=> timethis 50000: 17 wallclock secs ( 2.28 usr +  1.27 sys =  3.55 CPU) @ 14084.51/s (n=50000)
不能跑的(m#^[^/]//#;                 
             s#\G//#/#g;  )
=> timethis 50000: 15 wallclock secs ( 1.35 usr +  1.08 sys =  2.43 CPU) @ 20576.13/s (n=50000)
作者另一個(s#([\-\.\w]+)//#$1/#g; )
=> timethis 50000:  9 wallclock secs ( 2.38 usr +  0.68 sys =  3.06 CPU) @ 16339.87/s (n=50000)

[ 本帖最后由 wind_ch 于 2009-12-25 21:04 編輯 ]
作者: blackold    時間: 2009-12-26 19:16
標(biāo)題: 回復(fù) #8 wind_ch 的帖子
應(yīng)該是這樣才對吧:
@urls=qw(
http://www.a.com/file/in.html
http://www.a.com//big-dash-dash/in.html
http://www.a.com//big-dash-dash//in.html
);

foreach (@urls) {            
    s#\G//#/# while m#/[^/]+#g;
    print $_,"\n";
}

[ 本帖最后由 blackold 于 2009-12-26 19:24 編輯 ]
作者: wind_ch    時間: 2009-12-26 23:19
感謝黑哥!
但我感覺還是有些疑問.
待我把正則表達(dá)式好好搞一下, 再來請教.
作者: wind_ch    時間: 2010-01-08 16:45
看了mwm5提供的<<精通正則表達(dá)式>>3 4 5章和perlre, perlop. 疑問之處基本想通了.

對于\G, 他和^, $一樣, 他在正則表達(dá)式中雖然不匹配任何字符, 但是要匹配一個位置. 所以寫成#\G//#其實是說: 自上次匹配結(jié)束的位置后緊跟兩個/.
相當(dāng)于在$'上使用#^//#.
而我之前錯誤地以為, 使用\G會把引擎執(zhí)行匹配動作的起始位置定在上次匹配結(jié)束之后, 然后用\G后面的模式匹配剩余的串 (區(qū)別在于: \G自身是要匹配上一個位置, 而不是指示引擎從這里來開始匹配).

對于之前提到的: 想在上次匹配剩余的串中進(jìn)行模式匹配, 而模式不是一開始就匹配得上, 用\G是不行的.(perl好像不直接提供這樣的支持, 你需要使用/gc慢慢地挪到你想要的模式前面)

受啟發(fā)于黑哥的 s#\G//#/# while m#/[^/]+#g;
我有個更快些的 s#\G//#/# while m#//[^/]+/?[^/]+#gc;

再次感謝黑哥, 以及感謝mwm5提供不全(1,3,4,5章)但相當(dāng)夠用的<<精通正則表達(dá)式>>(中文版)

[ 本帖最后由 wind_ch 于 2010-1-8 16:46 編輯 ]
作者: suxingwakeup    時間: 2010-01-10 14:49
標(biāo)題: 回復(fù) #1 wind_ch 的帖子
樓主“但我自己運行都不好用, 而且我覺得應(yīng)該吧 m#^[^/]//# 寫成 m#^[^/]+?//#, 也不行.
是什么原因呢?”想明白了 麻煩告知下。。我也正糊涂中。。。
作者: wind_ch    時間: 2010-01-11 09:40
標(biāo)題: 回復(fù) #12 suxingwakeup 的帖子
你樓上就是原因.




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2