精華區beta RegExp 關於我們 聯絡資訊
作業環境:Firefox in Linux 程式語言:JavaScript 有些網頁很奇怪,剖析的時候會有兩個 body 標籤。 而使用 /body/ 和 /(body)/ 竟然有不一樣的結果。 請問括號的用意到底是… -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.56.185.102
LPH66:基本上括號只是分組用啊...除非該式子後面還有\1等 02/26 11:05
LPH66:另外你確定不是 <body> 和 </body> 的一對嗎? 02/26 11:05
> -------------------------------------------------------------------------- < 作者: xrancyma (…楊天淳…) 看板: RegExp 標題: Re: [問題] 請問括號的神奇作用 時間: Thu Feb 26 20:38:00 2009
LPH66:基本上括號只是分組用啊...除非該式子後面還有\1等 02/26 11:05
LPH66:另外你確定不是 <body> 和 </body> 的一對嗎? 02/26 11:05
在下知道 <body> 和 </body> 是一對的, 但是在下真的只是抓 <body> 而已。 網頁的原始碼有確認過了,確實是 <body> ... <body> .... </body> .. </body> 然而在下使用 /<body>/g.exec(htmlText) 與 /(<body>)/g.exec(htmlText) 確實產生不同的結果,令人相當納悶,而且嘗試了兩部電腦竟然都是這樣。 (作業環境都是 JavaScript in Firefox 3.0,但分別在 WinXP 和 Linux 下) 不知道是不是 Firefox 本身的問題,還是說在下對 RegExp 了解的不夠透徹。 -- 諸君,在下氣質佳。爾等欲增氣質者,可向在下之高雅氣質學習與看齊。 雖在下之氣質不若四蝦那般高雅,卻仍足為汝輩鄉民之楷模與表率。 此外, 在下懂不少,無論是天文、地理、文學、歷史、社會、經濟、科學、哲學者, 無不涉略,爾等可稱在下為「略懂鈴」;另外,在下亦精通全球數種重要語言, 包括國語、台語、中文、閩南語、英文、華文、河洛語等,接能朗朗上口。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.56.185.102
bcse:會不會是網站原始碼真的這樣寫? 02/27 18:25
xrancyma:樓上,原網站是真的這樣寫。不過您似乎未看清在下問題。 02/28 01:19
xrancyma:原網站怎麼寫不重要,在下想要請教的是 RegExp 的問題。 02/28 01:19
xrancyma:在下想問的問題寫得應該蠻清楚的…麻煩高手指點一下,謝. 02/28 01:21
giacch: 結果哪裡不一樣..? 弄個例子出來比較好想... 02/28 03:28
grence:已經有例子了啊.... 02/28 20:57
> -------------------------------------------------------------------------- < 作者: xrancyma (…楊天淳…) 看板: RegExp 標題: Re: [問題] 請問括號的神奇作用 時間: Sat Feb 28 16:14:04 2009
bcse:會不會是網站原始碼真的這樣寫? 02/27 18:25
xrancyma:樓上,原網站是真的這樣寫。不過您似乎未看清在下問題。 02/28 01:19
xrancyma:原網站怎麼寫不重要,在下想要請教的是 RegExp 的問題。 02/28 01:19
xrancyma:在下想問的問題寫得應該蠻清楚的…麻煩高手指點一下,謝. 02/28 01:21
giacch: 結果哪裡不一樣..? 弄個例子出來比較好想... 02/28 03:28
在下似乎找到部份解答,但是礙於英文不通,所以想請教各位, 麻煩版友們幫我翻譯一下他是在寫什麼: (x) Matches 'x' and remembers the match. These are called capturing parentheses. For example, /(foo)/ matches and remembers 'foo' in "foo bar." The matched substring can be recalled from the resulting array's elements [1], ..., [n]. (?:x) Matches 'x' but does not remember the match. These are called non-capturing parentheses. The matched substring can not be recalled from the resulting array's elements [1], ..., [n]. 看來括號似乎真有其用法…可惜在下英文真的太差…麻煩高手幫在下解釋一下,謝謝。 -- 諸君,在下氣質佳。爾等欲增氣質者,可向在下之高雅氣質學習與看齊。 雖在下之氣質不若四蝦那般高雅,卻仍足為汝輩鄉民之楷模與表率。 此外, 在下懂不少,無論是天文、地理、文學、歷史、社會、經濟、科學、哲學者, 無不涉略,爾等可稱在下為「略懂鈴」;另外,在下亦精通全球數種重要語言, 包括國語、台語、中文、閩南語、英文、華文、河洛語等,接能朗朗上口。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.56.185.102
salagadoola:陣列[0]裡面是比對到的字串,[1]裡面是第一組括號 02/28 17:07
salagadoola:/<(b)(d)>/.exec("<bd>")會拿到[0]=<bd> [1]=b [2]=d 02/28 17:10
salagadoola:用/<(?:b)(d)>/.exec("<bd>")則是 陣列[0]=<bd> [1]=d 02/28 17:12
> -------------------------------------------------------------------------- < 作者: grence (多想兩分鐘 = =") 看板: RegExp 標題: Re: [問題] 請問括號的神奇作用 時間: Sat Feb 28 21:10:32 2009 ※ 引述《xrancyma (…楊天淳…)》之銘言: : 推 LPH66:基本上括號只是分組用啊...除非該式子後面還有\1等 02/26 11:05 : → LPH66:另外你確定不是 <body> 和 </body> 的一對嗎? 02/26 11:05 : 在下知道 <body> 和 </body> 是一對的, : 但是在下真的只是抓 <body> 而已。 : 網頁的原始碼有確認過了,確實是 : <body> ... <body> .... </body> .. </body> : 然而在下使用 : /<body>/g.exec(htmlText) : 與 : /(<body>)/g.exec(htmlText) 弄成簡單的例子.... <script type='text/javascript'> var htmlText="<body> ... <body> .... </body> .. </body>"; alert(/<body>/g.exec(htmlText));//<body> alert(/(<body>)/g.exec(htmlText));//<body>,<body> </script> IE7 跟 FireFox的結果一樣,我也很好奇這兩個差在哪裡… : 確實產生不同的結果,令人相當納悶,而且嘗試了兩部電腦竟然都是這樣。 : (作業環境都是 JavaScript in Firefox 3.0,但分別在 WinXP 和 Linux 下) : 不知道是不是 Firefox 本身的問題,還是說在下對 RegExp 了解的不夠透徹。 -- 我有誤解原po的問題嗎 囧a -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.229.199.26
xrancyma:您並沒有誤解。在下就是這個問題! 03/01 00:42
> -------------------------------------------------------------------------- < 作者: giacch (小a) 看板: RegExp 標題: Re: [問題] 請問括號的神奇作用 時間: Sat Feb 28 23:17:58 2009 ※ 引述《grence (多想兩分鐘 = =")》之銘言: : 弄成簡單的例子.... : <script type='text/javascript'> : var htmlText="<body> ... <body> .... </body> .. </body>"; : alert(/<body>/g.exec(htmlText));//<body> : alert(/(<body>)/g.exec(htmlText));//<body>,<body> : </script> : IE7 跟 FireFox的結果一樣,我也很好奇這兩個差在哪裡… 原以為 因為有兩個body 所以有加()的傳回兩個body 但看來不是... 而且傳回的都是第一個body <script type='text/javascript'> var htmlText="<bodya> ... <bodyb> .... </body> .. </body>"; alert(/(<body.?>)/g.exec(htmlText)); //<bodya>,<bodya> alert(/<body.?>/g.exec(htmlText)); //<bodya> </script> 就算只給一個body 有加()的還是會傳回 <body>,<body> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.232.172.163
giacch: Opera 02/28 23:21
xrancyma:感覺很像是BUG…該不會 IE 和 FF 的 BUG 都一樣吧? 03/01 00:40
補充一下... <script type='text/javascript'> var htmlText="<bodya> .. <bodyb> .... <bodyc>"; alert( "A: " + htmlText.match(/(<body.?>)/g) ); // A: <bodya>,<bodyb>,<bodyc> alert( "B: " + htmlText.match(/(<body.?>)/g).length ); // B: 3 alert( "C: " + htmlText.match(/(<body.?>)/g)[0] ); // C: <bodya> alert( "D: " + htmlText.match(/(<body.?>)/g)[1] ); // D: <bodyb> alert( "E: " + htmlText.match(/(<body.?>)/g)[2] ); // E: <bodyc> alert( "F: " + htmlText.match(/(<body.?>)/g)[3] ); // F: undefined </script> 以下取自 http://www.w3schools.com/jsref/jsref_obj_regexp.asp exec() Search a string for a specified value. Returns the found value and remembers the position match() Search a string for a specified value. Returns an array of the found value(s) ( ) Finds the group of characters inside the parentheses and stores the matched string
giacch: 爆... XD 03/01 01:09
※ 編輯: giacch 來自: 118.232.172.163 (03/01 01:17) > -------------------------------------------------------------------------- < 作者: MichaelHsin (BBS之蟲) 看板: RegExp 標題: Re: [問題] 請問括號的神奇作用 時間: Sun Mar 1 03:59:24 2009 http://www.webreference.com/js/column5/methods.html regex.exec() 傳回的 array,[0] 是 last match,[1], [2], ... 是 capture 的結果 至於 //g 的效果在前面的 code 裡都沒有出現,當然不會 match 到第二、三個 body( "bodyb", "bodyc")。 請參考以下 code,就知道問題在哪裡: === var text = "blah bodya aaa bodyb bb bodyc"; while(ar = /(body.?)/g.exec(text)) { document.write(ar.length, "<br/>"); document.write(ar.index, "<br/>"); document.write(ar.input, "<br/>"); document.write(ar[0], "<br/>"); document.write(ar[1], "<br/>"); document.write(ar[2], "<br/>"); document.write(ar, "<br/>"); } === --- 話說我並是不會寫 js orz -- 「為什麼會有兩張鬼牌?」 『每次都讓它當鬼不是很可憐嗎?所以剩下的一張就是今天的鬼。 人類要是也能像這樣輕鬆配對,就省事了。 有時候8喜歡10,有時候K黏著2,有時候是黑桃同志糾纏不清。』 「你換掉鬼牌,就是在想這些麻煩事嗎?」 -- 安達充 《H2》 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.55
xrancyma:…感謝… 03/03 00:47