精華區beta RegExp 關於我們 聯絡資訊
※ [本文轉錄自 perl 看板] 作者: willhunting (這些年來) 看板: perl 標題: [問題] 關於regular expression 時間: Thu Oct 4 04:26:21 2007 Hi!各位先進,我是perl的新手,現在在處理字串上遇到了一點麻煩想來 這裡跟各位討教。是這樣的,我目前要對使用者輸入的搜尋字串作一些 判別,規則是這樣的: 1. cat : 使用者要找cat這個字 2. "cat dog" : 使用者要找cat dog,一定要連在一起 3. !pig : 使用者要找不含pig的 4. !"pig duck" : 使用者要找不含連在一起的"pig duck" 因為上述所有組合可能在一個command裡面包含,所以我要個別進行判別 再作處理,所以我對四種狀況的判讀是這樣寫的 1. /^[^!]\S+/ 2. /^"(\S+\s*)+"$/ 3. /^![^"]\S+/ 4. /^!"(\S+\s*)+"/ <= 出問題了 1-3都沒有問題,但第4個,也就是處理!"pig duck"這樣子的情況時,如果中間 有空格,perl會以規則1去抓出duck"來,但如果中間不放空格,也就是如果把 輸入改成!"pigduck"的話就沒問題,請問該用什麼樣的regex來寫比較好呢? 謝謝!! -- 派特.萊利說道 : "他仍然是米高.佐丹(Michael Jordan)" 2001. Oct -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 160.39.59.116
david220:4. /^!"(\S+\s*)+"/ S前少一個\ 10/04 09:03
willhunting:喔 抱歉 我是在這裡沒打上 我程式裡還是有\的 10/04 09:31
Andor:2也沒問題嗎? 4--> /^!"((\S+\s*)+)"/ 10/04 09:42
※ 編輯: willhunting 來自: 160.39.247.23 (10/04 10:02) ※ 編輯: willhunting 來自: 160.39.247.23 (10/04 10:02)
willhunting:A兄 4我照這樣打也還是不行 說不定是我其他規則定的 10/04 10:05
willhunting:有ambiguous的狀況 想請教2的問題可能是哪裡呢? 10/04 10:06
badwork:regexp已經開版囉,大家可以移過去討論~~ 10/04 17:45
-- 派特.萊利說道 : "他仍然是米高.佐丹(Michael Jordan)" 2001. Oct -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 160.39.59.116 > -------------------------------------------------------------------------- < 作者: adrianshum (Alien) 看板: RegExp 標題: Re: [問題] 關於regular expression 時間: Fri Oct 5 18:10:41 2007 ※ 引述《willhunting (這些年來)》之銘言: : ※ [本文轉錄自 perl 看板] : 作者: willhunting (這些年來) 看板: perl : 標題: [問題] 關於regular expression : 時間: Thu Oct 4 04:26:21 2007 : Hi!各位先進,我是perl的新手,現在在處理字串上遇到了一點麻煩想來 : 這裡跟各位討教。是這樣的,我目前要對使用者輸入的搜尋字串作一些 : 判別,規則是這樣的: : 1. cat : 使用者要找cat這個字 : 2. "cat dog" : 使用者要找cat dog,一定要連在一起 : 3. !pig : 使用者要找不含pig的 : 4. !"pig duck" : 使用者要找不含連在一起的"pig duck" : 因為上述所有組合可能在一個command裡面包含,所以我要個別進行判別 : 再作處理,所以我對四種狀況的判讀是這樣寫的 : 1. /^[^!]\S+/ : 2. /^"(\S+\s*)+"$/ : 3. /^![^"]\S+/ : 4. /^!"(\S+\s*)+"/ <= 出問題了 : 1-3都沒有問題,但第4個,也就是處理!"pig duck"這樣子的情況時,如果中間 : 有空格,perl會以規則1去抓出duck"來,但如果中間不放空格,也就是如果把 : 輸入改成!"pigduck"的話就沒問題,請問該用什麼樣的regex來寫比較好呢? : 謝謝!! 不熟 Perl 你的意思是想靠 regex 來判定究竟輸入的格式 是四種中的哪一種是嗎? 但如果你輸入 !"pig duck", 理應不會 match 第一 個 regex 呀, 因為 start of line 後面就是 ! 了 另, 第四個有需要那麼複雜嘛? 反正是 以 ! 開頭, 然後 " , 然後至少一個 non-space char, 再 " 那麼 /^!"\S.*"$ 不就好了? Alien -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 202.22.246.26 ※ 編輯: adrianshum 來自: 202.22.246.26 (10/05 18:11) > -------------------------------------------------------------------------- < 作者: qrtt1 (愚人) 看板: RegExp 標題: Re: [問題] 關於regular expression 時間: Sun Oct 7 20:05:29 2007 @regex = ('(!?)"([^"]*?)"', '(!?)(\w+)'); 就只是有 ! 的表示不要的 和有"的表示一個完整的詞而已。 regex 所以只有二組規則嚕。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.49.182 > -------------------------------------------------------------------------- < 作者: cutecpu (可愛中央處理器) 看板: RegExp 標題: Re: [問題] 關於regular expression 時間: Mon Oct 8 12:48:57 2007 ※ 引述《qrtt1 (愚人)》之銘言: : @regex = ('(!?)"([^"]*?)"', '(!?)(\w+)'); ~這個問號加不加差在哪裡?謝謝^^ : 就只是有 ! 的表示不要的 : 和有"的表示一個完整的詞而已。 : regex 所以只有二組規則嚕。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.184.70 > -------------------------------------------------------------------------- < 作者: MichaelHsin (BBS之蟲) 看板: RegExp 標題: Re: [問題] 關於regular expression 時間: Mon Oct 8 15:05:13 2007 ※ 引述《cutecpu (可愛中央處理器)》之銘言: : ※ 引述《qrtt1 (愚人)》之銘言: : : @regex = ('(!?)"([^"]*?)"', '(!?)(\w+)'); : ~這個問號加不加差在哪裡?謝謝^^ : : 就只是有 ! 的表示不要的 : : 和有"的表示一個完整的詞而已。 : : regex 所以只有二組規則嚕。 一般的 quantifier (*, +, {n}, {n,}, {n,m}) 會 match 最長字串, 而在 quantifier 後面接 ? 是叫它 match 最短字串。 例如 "blahblahblah": /b.*a/ -> "blahblahbla" /b.*?a/ -> "bla" -- 「為什麼會有兩張鬼牌?」 『每次都讓它當鬼不是很可憐嗎?所以剩下的一張就是今天的鬼。 人類要是也能像這樣輕鬆配對,就省事了。 有時候8喜歡10,有時候K黏著2,有時候是黑桃同志糾纏不清。』 「你換掉鬼牌,就是在想這些麻煩事嗎?」 -- 安達充 《H2》 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.55 > -------------------------------------------------------------------------- < 作者: LiloHuang (相見不如懷念) 看板: RegExp 標題: Re: [問題] 關於regular expression 時間: Thu Oct 11 00:00:40 2007 ※ 引述《cutecpu (可愛中央處理器)》之銘言: : 1./b[^a].*a/ : 2./b[^a].*?a/ : 上面兩個的definition power應該一樣吧? : 反正上面兩個碰到第一個a就會match最後結尾的紅a了 : 不知道這樣有理解有錯嗎?? #!/usr/bin/perl $str = "blahblahblah"; print $1,$/ if($str =~ /(b[^a].*a)/); print $1,$/ if($str =~ /(b[^a].*?a)/); 這是為了避免 Greedy 比對 可參考 http://www.unix.org.ua/orelly/perl/cookbook/ch06_16.htm -- 莉洛 - 空房間的秘密 http://blog.roodo.com/kenwu/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.216.27
cutecpu:推 10/11 00:30
> -------------------------------------------------------------------------- < 作者: MichaelHsin (BBS之蟲) 看板: RegExp 標題: Re: [問題] 關於regular expression 時間: Thu Oct 11 00:12:41 2007 ※ 引述《cutecpu (可愛中央處理器)》之銘言: : ※ 引述《MichaelHsin (BBS之蟲)》之銘言: : : 一般的 quantifier (*, +, {n}, {n,}, {n,m}) 會 match 最長字串, : : 而在 quantifier 後面接 ? 是叫它 match 最短字串。 : : 例如 "blahblahblah": : : /b.*a/ -> "blahblahbla" : : /b.*?a/ -> "bla" : 如果寫成 : 1./b[^a].*a/ blahblahbla : 2./b[^a].*?a/ bla : 上面兩個的definition power應該一樣吧? : 反正上面兩個碰到第一個a就會match最後結尾的紅a了 : 不知道這樣有理解有錯嗎?? quantifier 後面的問號只是讓這個 quantifier 改 match 最短字串。 /b[^a].*a/ 的 .* 會 match ahblahbl /b[^a].*?a/ 的 .*? 會 match 空字串 -- 芸曰:「今世不能,期以來世。」 余曰:「來世卿當作男,我為女子相從。」 芸曰:「必得不昧今生,方覺有情趣。」 余笑曰:「幼時一粥猶談不了;若來世不昧今世,合巹之夕,細談隔世,更無合 眼時矣。」 -- 沈復 《浮生六記》 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.55 ※ 編輯: MichaelHsin 來自: 140.112.30.55 (10/11 00:12)
cutecpu:推 10/11 00:30
> -------------------------------------------------------------------------- < 作者: bcse (Lvx ex Caelis) 看板: RegExp 標題: Re: [問題] 關於regular expression 時間: Tue Nov 20 12:56:43 2007 ※ 引述《MichaelHsin (BBS之蟲)》之銘言: : ※ 引述《cutecpu (可愛中央處理器)》之銘言: : : ~這個問號加不加差在哪裡?謝謝^^ : 一般的 quantifier (*, +, {n}, {n,}, {n,m}) 會 match 最長字串, : 而在 quantifier 後面接 ? 是叫它 match 最短字串。 : 例如 "blahblahblah": : /b.*a/ -> "blahblahbla" : /b.*?a/ -> "bla" 請問一下,如果我想要取 bla 的話,下面兩種寫法哪一種比較好? 1. /b.*?a/ 2. /b[^a]*a/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 134.208.33.185
bcse:自己測了一下效率發現似乎沒有什麼差別 XD 11/20 13:04
LiloHuang:一般來講後者比較好 11/20 19:09
bcse:謝謝回答 :) 11/20 21:22