![]() |
||
|
Registered User
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
之前我都是自寫的...
寫過應該知道Regex沒有一定的形式, 變化性高... 這是我從微軟的VS看到的pattern, 用來檢查HTTP URL的合法性.. http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 除了一個基本的Domain Name命名,也考慮到子目錄和QueryString的情況. 其實想問的問題很簡單, 整個pattern的後半部(/[\w- ./?%&=]*)? (/[之間的/符號可以不加吧?? ...加了感覺好像會有問題的樣子... http://www.test.com.tw?id=a1111995 這樣的形式不就不符合這個pattern了嗎? ..還是我少考慮到什麼?? ...另一個是這個從VS看到的pattern, 用來檢查E-Mail格式: \w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 那個最後接的([-.]\w+)*, 總覺得可加可不加的樣子... ![]() 總覺得: string pattern= @"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+$"; 不加看起來也符合阿... 求教高手或著專業的5樓現身... ...此文章於 2011-07-01 04:36 PM 被 vxr 編輯. |
|||||||
|
|
|
Major Member
![]() 加入日期: Aug 2001
文章: 211
|
引用:
你給的資訊太少, 我不能給你太多我的想法, RE 我不是非常強, 但應該還算是有堪用程度, 我在三四種語言中用過 RE, 每種都有點點不一樣, 但其實還是有基本標準在. 1. 請問你使用語言是哪一種? 請問你用的是語言內建 RE 或是 library 利如 PCRE (我通常都用這個, 屬於 Perl 系). 2. 請問你用哪一種 RE 標準? 目前常見 RE 有三種: POSIX, POSIX extension, Perl compatible, 此外還有一些軟體自訂的. 回你的問題, 我是以我看到的來說: 1. 加 () 非常奇怪, 因為只是做驗證, 沒有要做字串替換, 不需要上 group, 理論上可以把所有 () 通通拿掉, 如 pattern 1: https?://[\w-]+\.+[\w-]+/[\w- ./?%&=]*? 2. \w 在你使用的 RE 中是什麼意思? 是 white-space 還是 word? 我要下班了, 其他的有空再討論, 先回你第一個問題, 最後一個 [ 之前的 / 如果是可有可無, 你就加一個 ? 在 / 後面即可, 這樣 http://www.test.com.tw?id=a1111995 應該就不會有問題了.
__________________
滿招損 謙受益 |
|||
|
|
|
Registered User
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
引用:
我是直接用該語言整合的RE... 並沒有參考其他lib(有現成就直接用囉.. ...)..目前是看javascript和微軟NET.的C#(進入CLR[CTS, CLS]之後, 這部分差不到哪..) "加 () 非常奇怪, 因為只是做驗證, 沒有要做字串替換, 不需要上 group, 理論上可以把所有 () 通通拿掉, 如 pattern 1:" https?://[\w-]+\.+[\w-]+/[\w- ./?%&=]*? 這是微軟的IDE給的 我的想法是... ()作為子匹配的話..., 還是有意義存在吧(未必只是作為替換..)..... 子匹配會被緩衝 使用\num做back reference抓取子匹配.., 在有些情況作驗證還是有幫助... 例如HTML tag檢查, 給他group讓他子匹配緩衝供下次使用...... 再來, 這範例不加(), 不是會很奇怪嗎 ...其中([\w-]+\.)+ , 匹配允許aaa.bbb.ccc 問號拿掉: [\w-]+\.+, 我的想法是 aaa..... 這樣的奇怪情況不是也可以符合??.. 如果不想給他分組做緩衝, 用(=pattern)也是可以吧... 不想讓子匹配緩衝且不回傳, 用(?: pattern) 也是可行... 一個微軟MSDN的例子: (,[0-9]{3})* 尋找零個以上出現的下列模式:群組分隔符號加三個十進位數字。 你把()拿掉不就很奇怪的??.. \ 的問題... 我的意思是說那個/應該可以直接省掉吧.... ![]() 變成=> http(s)?://([\w-]+\.)+[\w-]+([\w- ./?%&=]*)? "\w 在你使用的 RE 中是什麼意思? 是 white-space 還是 word?" \w=[A-Za-z0-9_] 此文章於 2011-07-01 07:56 PM 被 vxr 編輯. |
|
|
|
|
Elite Member
![]() ![]() ![]() ![]() ![]() 加入日期: Jan 2002
文章: 4,035
|
我是學Perl的Regular Expression , 不過目前Perl已經好久沒用了,都轉換到PHP來了...
我反倒是覺得,要學好Regular Expression只要去看那本Larry Wall的駱駝書,記得是第二章吧? 就是專門講5 step for Regular expression !! 說實話,我也不大記得清楚那5 step 為何 !! 不過就當時學起來這個rule後,就非常受用至今 ,一直到PHP後,也還是一直用它的rules 如果是要寫一個萬用型的程式來取得HTML Document裡的URL ,小弟之前曾經在交大裡的 一個地下BBS Tiger2 曾經發表過一個Perl寫的程式,我自己有備份起來,不過需要再找找.... 當初寫這程式,動機是為了要自動抓取 美女圖 , 有需要的話請說一聲!! ![]() 我認為啦,所有的pattern的設計是為了遇到分析的string能夠match ,然後將資料取出來運用 但如果你不是當初設計pattern的人,只是單純拿來運用的話,那造成的結果就是您現在的這個 動作了!! 所以 , 如果您可以直接說您的需求 ,那再來設計Regular expression來用,就可以 充份符合您的需要!! 這也比較符合Regular Expression的真正精神之所在... ![]()
__________________
您想買新硬碟嗎? 購買前請務必參考這篇文章,是我的實際經驗 還想讓統一賺你的錢嗎?統一集團成員(能見度高的): 星巴克、家樂福、7-11、無印良品、黑貓宅急便、聖娜多堡、阪急百貨、 康是美、博客來、夢時代、Mister Donut 、Cold Stone 、龜甲萬、 維力33%股權、光泉31%股權、Smile速邁樂、紅心辣椒、台北轉運站(統一企業BOT) 統一LP33膠囊有環保署早已列管的一級管制品: DNOP塑化劑 |
|
|
|
Registered User
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
只是想玩玩寫寫文章而已...
工作需求尚未考慮到... 只是看到一些現成的範例有些疑惑.. Regex我大多最長應用是作為驗證檢查之類的... 此文章於 2011-07-01 08:20 PM 被 vxr 編輯. |
|
|
|
Elite Member
![]() ![]() ![]() ![]() ![]() 加入日期: Jan 2002
文章: 4,035
|
就回應vxr大的問題, Regular Expression的 (....) 的左又括弧,是為了能夠將括弧內的
matched 資料給取出來,才特地去刮弧起來的 , 當然如果您不需要刮弧裡的資料,當然就不需要用到() 囉 !!
__________________
您想買新硬碟嗎? 購買前請務必參考這篇文章,是我的實際經驗 還想讓統一賺你的錢嗎?統一集團成員(能見度高的): 星巴克、家樂福、7-11、無印良品、黑貓宅急便、聖娜多堡、阪急百貨、 康是美、博客來、夢時代、Mister Donut 、Cold Stone 、龜甲萬、 維力33%股權、光泉31%股權、Smile速邁樂、紅心辣椒、台北轉運站(統一企業BOT) 統一LP33膠囊有環保署早已列管的一級管制品: DNOP塑化劑 |
|
|
|
Registered User
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
引用:
可是就這樣的例子, 做匹配檢查, 比方說我透過微軟的IDE工具拉一個Regular Expression Validator物件加入pattern: (,[0-9]{3})* 尋找零個以上出現的下列模式:群組分隔符號加三個十進位數字。 你把()拿掉不就很奇怪的??.. ...同樣拆出來看的話... ([\w-]+\.)+ 拿掉(), 做匹配檢查... 總覺得不太合理..... 不想給他分組做緩衝且回傳.. 直接用(?: pattern)也可以吧.. 此文章於 2011-07-01 08:27 PM 被 vxr 編輯. |
|
|
|
|
Registered User
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
我剛寫一個ASP.NET page拉Validator物件檢查...
直接把([\w-]+\.)+的()拿掉會有問題... 會變成www.bbb.ccccc這樣的形式不會通過.. 反而是aaa. , c.....或著xyzs........會通過 |
|
|
|
Elite Member
![]() ![]() ![]() ![]() ![]() 加入日期: Jan 2002
文章: 4,035
|
引用:
請注意我之前說的.... 如果你有需要刮弧裡的資料,才去刮弧起來,如果只是要match ,不需要matched 後的資料 那刮弧可以不用!! 上面的例子,是需要刮弧內的資料,然後再去match zero or more (意思是說,只要match 0個或以上) 那個pattern的意思是說, 我要match 一個","及數字,數字一組要三個,比如說(000 001 002 ....以此類推) 然後這個matched後的資料,其數目要zero or more !! 也就是說,如果字串是 "123,456,789,000" 就會match ,而matched之後的資料是 ,456,789,000 有錯請指正!!
__________________
您想買新硬碟嗎? 購買前請務必參考這篇文章,是我的實際經驗 還想讓統一賺你的錢嗎?統一集團成員(能見度高的): 星巴克、家樂福、7-11、無印良品、黑貓宅急便、聖娜多堡、阪急百貨、 康是美、博客來、夢時代、Mister Donut 、Cold Stone 、龜甲萬、 維力33%股權、光泉31%股權、Smile速邁樂、紅心辣椒、台北轉運站(統一企業BOT) 統一LP33膠囊有環保署早已列管的一級管制品: DNOP塑化劑 |
|
|
|
|
Elite Member
![]() ![]() ![]() ![]() ![]() 加入日期: Jan 2002
文章: 4,035
|
天啊 ,這樣討論很累....
直接一點啦, vxr大 , 把您的需求說出來,直接把regular expression設計給您運用好了!! 如何?
__________________
您想買新硬碟嗎? 購買前請務必參考這篇文章,是我的實際經驗 還想讓統一賺你的錢嗎?統一集團成員(能見度高的): 星巴克、家樂福、7-11、無印良品、黑貓宅急便、聖娜多堡、阪急百貨、 康是美、博客來、夢時代、Mister Donut 、Cold Stone 、龜甲萬、 維力33%股權、光泉31%股權、Smile速邁樂、紅心辣椒、台北轉運站(統一企業BOT) 統一LP33膠囊有環保署早已列管的一級管制品: DNOP塑化劑 |
|
|