PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

  回應
 
主題工具
vxr
Registered User
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation 詢問一個Regular Expression的pattern...!!

之前我都是自寫的...
寫過應該知道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 編輯.
舊 2011-07-01, 04:33 PM #1
回應時引用此文章
vxr離線中  
darkangel
Major Member
 
darkangel的大頭照
 

加入日期: Aug 2001
文章: 211
引用:
作者vxr
之前我都是自寫的...
寫過應該知道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+$";
不加看起來...


你給的資訊太少, 我不能給你太多我的想法, 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 應該就不會有問題了.
 
__________________
滿招損 謙受益
舊 2011-07-01, 06:42 PM #2
回應時引用此文章
darkangel離線中  
vxr
Registered User
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

引用:
作者darkangel
你給的資訊太少, 我不能給你太多我的想法, 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?

我要下班了, 其他的有空再討論, 先回你第一個問題, 最後一個 [ 之前的 / 如果是可有可無, 你就加一個 ? 在 / 後面即可, 這樣 ...

我是直接用該語言整合的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 編輯.
舊 2011-07-01, 07:51 PM #3
回應時引用此文章
vxr離線中  
anderson1127
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塑化劑
舊 2011-07-01, 08:14 PM #4
回應時引用此文章
anderson1127離線中  
vxr
Registered User
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

只是想玩玩寫寫文章而已...
工作需求尚未考慮到...

只是看到一些現成的範例有些疑惑..

Regex我大多最長應用是作為驗證檢查之類的...

此文章於 2011-07-01 08:20 PM 被 vxr 編輯.
舊 2011-07-01, 08:18 PM #5
回應時引用此文章
vxr離線中  
anderson1127
Elite Member
 

加入日期: Jan 2002
文章: 4,035
就回應vxr大的問題, Regular Expression的 (....) 的左又括弧,是為了能夠將括弧內的
matched 資料給取出來,才特地去刮弧起來的 , 當然如果您不需要刮弧裡的資料,當然就不需要用到() 囉 !!
__________________
您想買新硬碟嗎? 購買前請務必參考這篇文章,是我的實際經驗

還想讓統一賺你的錢嗎?統一集團成員(能見度高的):
星巴克、家樂福、7-11、無印良品、黑貓宅急便、聖娜多堡、阪急百貨、
康是美、博客來、夢時代、Mister Donut 、Cold Stone 、龜甲萬、
維力33%股權、光泉31%股權、Smile速邁樂、紅心辣椒、台北轉運站(統一企業BOT)

統一LP33膠囊有環保署早已列管的一級管制品: DNOP塑化劑
舊 2011-07-01, 08:21 PM #6
回應時引用此文章
anderson1127離線中  
vxr
Registered User
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

引用:
作者anderson1127
就回應vxr大的問題, Regular Expression的 (....) 的左又括弧,是為了能夠將括弧內的
matched 資料給取出來,才特地去刮弧起來的 , 當然如果您不需要刮弧裡的資料,當然就不需要用到() 囉 !!

可是就這樣的例子, 做匹配檢查, 比方說我透過微軟的IDE工具拉一個Regular Expression Validator物件加入pattern:
(,[0-9]{3})*
尋找零個以上出現的下列模式:群組分隔符號加三個十進位數字。
你把()拿掉不就很奇怪的??.. ...

同樣拆出來看的話...
([\w-]+\.)+
拿掉(), 做匹配檢查...
總覺得不太合理.....
不想給他分組做緩衝且回傳..
直接用(?: pattern)也可以吧..

此文章於 2011-07-01 08:27 PM 被 vxr 編輯.
舊 2011-07-01, 08:25 PM #7
回應時引用此文章
vxr離線中  
vxr
Registered User
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

我剛寫一個ASP.NET page拉Validator物件檢查...
直接把([\w-]+\.)+的()拿掉會有問題...
會變成www.bbb.ccccc這樣的形式不會通過..
反而是aaa. , c.....或著xyzs........會通過
舊 2011-07-01, 08:31 PM #8
回應時引用此文章
vxr離線中  
anderson1127
Elite Member
 

加入日期: Jan 2002
文章: 4,035
引用:
作者vxr
可是就這樣的例子, 做匹配檢查, 比方說我透過微軟的IDE工具拉一個Regular Expression Validator物件加入pattern:
(,[0-9]{3})*
尋找零個以上出現的下列模式:群組分隔符號加三個十進位數字。
你把()拿掉不就很奇怪的??.. ...


請注意我之前說的....
如果你有需要刮弧裡的資料,才去刮弧起來,如果只是要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塑化劑
舊 2011-07-01, 08:34 PM #9
回應時引用此文章
anderson1127離線中  
anderson1127
Elite Member
 

加入日期: Jan 2002
文章: 4,035
天啊 ,這樣討論很累....

直接一點啦, vxr大 , 把您的需求說出來,直接把regular expression設計給您運用好了!! 如何?
__________________
您想買新硬碟嗎? 購買前請務必參考這篇文章,是我的實際經驗

還想讓統一賺你的錢嗎?統一集團成員(能見度高的):
星巴克、家樂福、7-11、無印良品、黑貓宅急便、聖娜多堡、阪急百貨、
康是美、博客來、夢時代、Mister Donut 、Cold Stone 、龜甲萬、
維力33%股權、光泉31%股權、Smile速邁樂、紅心辣椒、台北轉運站(統一企業BOT)

統一LP33膠囊有環保署早已列管的一級管制品: DNOP塑化劑
舊 2011-07-01, 08:40 PM #10
回應時引用此文章
anderson1127離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是08:49 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2026。