引用:
|
作者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_]