[Regex] 不包含定位詞的向前或向後選取

文章推薦指數: 80 %
投票人數:10人

每修改它一次其實就是 new 一個已修改過的object,這樣的做法在記憶體及效能上來說不太優. 所以今天要來講如何用正則表達式(正規表示法),乾脆俐落地 ... 1月30,2018 / Regex,程式語言 ※綠色的是定位詞,藍色是選取的詞   以前我在parsehtml的element時都是用Substring()配IndexOf() 但每做一次Substring()就會想起以前老師講過string是一個object 每修改它一次其實就是new一個已修改過的object,這樣的做法在記憶體及效能上來說不太優 所以今天要來講如何用正則表達式(正規表示法),乾脆俐落地擷取到想要的字   ※因為我實在想不到要怎麼用中文表示,正則表達式先找的到那個詞,再以它為基準向前或向後選取,所以使用"定位詞"一詞。

希望大家不要太介意,能讓意思傳達給各位就好:P   PositiveLookbehind 顧名思義就是先找到定位詞,然後從定位詞尾端開始向後選取 語法: (?<=...) 上面的"..."(不包含引號)請填定位詞   拿常見的html程式碼當例子 假設今天__VIEWSTATE的value會根據每次瀏覽而改變,而且數字及英文大小寫沒有一定的位置,也沒有好用的library可以直接獲得tagvalue 我們的備案就會想從value=往後找雙引號內的所有東西 因此,正則表達式就可以寫成 (?<=(value=")).*" value="用括號刮起來是為了讓正則表達式判斷成一個詞 .代表任意字元 *代表可以是0個或多個 "則是結尾的雙引號 如此一來就可以順利直接選到value了(歡呼~ ※綠色的是定位詞,藍色是選取的詞   這時眼尖的網友表示:咦~不對啊,那最後的雙引號怎辦? 沒錯,於是輪到第二個主題positivelookahead登場。

  PositiveLookahead 類似positivelookbehind先找到定位詞,然後從定位詞最前端開始向前選取 語法: (?=...) 上面的"..."(不包含引號)請填定位詞   繼續剛剛上面完成一半的例子,我們不想要最後面的雙引號 (?<=(value=")).*"   把最後面的雙引號先拿掉,兜成定位詞 (?=")   再加回去剛剛的表達式 (?<=(value=")).*(?=")   登愣,結果正是我們想要的value值。

※綠色的是定位詞,藍色是選取的詞   額外補充 可以用Regex101這個網站先試試正則表達式的語法有沒有符合需求 對於更大的範圍還可以在前面加上id,指定要哪個id後的value 2018/10/14謝謝網友raku的更正 應該是(?<=(value=")).*?(?=") 而不是(?<=(value=")).*(?=") *是比對前一個規則零次至多次 這樣中間如果有雙引號也會被算進去,直到最後一個雙引號前止 應該改成*?來限制滿足越少次越好,才能保證最近的兩個雙引號成對 標籤:Regex AndyWu 一顆剛畢業不久還新鮮的肝。

持續努力學習中~ 上一篇文章 下一篇文章 2則迴響 raku2018-10-14 中間那段應該改用非貪婪的寫法「.*?」,否則若後面還有引號他會繼續匹配然後再去抓最後一個引號 回復 AndyWu2018-10-15 已經修改了,謝謝你的更正^^ 回復 發佈留言取消回覆 在瀏覽器中儲存顯示名稱、電子郵件地址及個人網站網址,以供下次發佈留言時使用。

關於我AboutMeAndyWu 一顆剛畢業不久還新鮮的肝。

持續努力學習中~   More... 搜尋Search 分類Categories Arduino(1) 零件(1) Docker(2) Linux、Mac(6) 應用程式(6) MIFAREOne(4) Regex(1) 個人(1) 區塊鏈(4) 機器學習(5) 版本控制(6) Git(6) SVN(1) 生活DIY(1) 程式語言(15) C(1) C#(2) Java(2) JavaScript(1) Node.js(2) Python(6) 網路概論(5) 計算機概論(1) 資料庫(9) SQL(5) 資訊安全(5) 雜記(2) 近期文章Posts 淺談MySQL隔離層級為RR(可重復讀)時不能避免PhantomRead(幻讀) [MySQL/MariaDB]優化查詢語句OFFSET越大時間越久的問題 Node.js實作Mutex(互斥鎖)防止緩存擊穿 [InnoDB]要回刪除table資料後未被釋放的空間 [MySQL/MariaDB]使用SlowQueryLog來偵錯 近期迴響Comments「AndyWu」於〈IP等級與子網路遮罩介紹〉發佈留言「AndyWu」於〈IP等級與子網路遮罩介紹〉發佈留言「AndyWu」於〈完整圖解Node.js的EventLoop(事件迴圈)〉發佈留言「AndyWu」於〈挖礦到底是在讓電腦計算什麼〉發佈留言「TETS」於〈IP等級與子網路遮罩介紹〉發佈留言



請為這篇文章評分?