[Regex] 不包含定位詞的向前或向後選取
文章推薦指數: 80 %
每修改它一次其實就是 new 一個已修改過的object,這樣的做法在記憶體及效能上來說不太優. 所以今天要來講如何用正則表達式(正規表示法),乾脆俐落地 ...
1月30,2018
/
Regex,程式語言
※綠色的是定位詞,藍色是選取的詞
以前我在parsehtml的element時都是用Substring()配IndexOf()
但每做一次Substring()就會想起以前老師講過string是一個object
每修改它一次其實就是new一個已修改過的object,這樣的做法在記憶體及效能上來說不太優
所以今天要來講如何用正則表達式(正規表示法),乾脆俐落地擷取到想要的字
※因為我實在想不到要怎麼用中文表示,正則表達式先找的到那個詞,再以它為基準向前或向後選取,所以使用"定位詞"一詞。
希望大家不要太介意,能讓意思傳達給各位就好:P
PositiveLookbehind
顧名思義就是先找到定位詞,然後從定位詞尾端開始向後選取
語法:
(?<=...)
上面的"..."(不包含引號)請填定位詞
拿常見的html程式碼當例子
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等級與子網路遮罩介紹〉發佈留言
延伸文章資訊
- 1正規表示式Regular Expression - Poy Chang
正規表示式可以幫助我們快速找到符合文字模式的字串,但執行效率未必”快速”,不精確的寫法還是很容易造成效能低落的問題。 以C# 為例,有幾個提升效率的注意事項:. 能使用 ...
- 2Day 12: 正規表示式(Regular Expression) - iT 邦幫忙
表示式 var pattern = new RegExp(s$) or var pattern =/s$/ 代表著以s結尾的字串都匹配。 ... (?=p), 要求後面的字元必須匹配p(回傳時不...
- 3Regex 使用^ 符號排除特定字元 - 菜鳥工程師肉豬
在正規表示式可用 ^ (caret)符號來排除後接的字元。 ^ 是正規表示式的metacharacter(metacharacter的中文翻譯很多,例如元字符,中繼字符,特用 ...
- 4正規表達式- JavaScript - MDN Web Docs
使用正規表達式字面值(regular expression literal),包含兩個 / 字元之間 ... 在字符串中的"Grab crab"('ab c') 中將不會被匹配,因為它不包含任何...
- 5[Regex] 不包含定位詞的向前或向後選取
每修改它一次其實就是 new 一個已修改過的object,這樣的做法在記憶體及效能上來說不太優. 所以今天要來講如何用正則表達式(正規表示法),乾脆俐落地 ...