- Scala編程實戰(原書第2版)
- (美)阿爾文·亞歷山大
- 785字
- 2024-04-15 12:05:17
2.7 字符串的模式查找
問題
你想要在String中搜索,查看其是否包含一個正則表達式。
解決方案
在一個字符串上調用.r方法可以創建一個Regex對象,如果想在一個字符串中查找一個Regex匹配的模式則使用其findFirstIn方法,如果想查找所有匹配的模式則使用其findAllIn方法。
為了驗證上面的說法,首先需要為想要搜索的模式創建一個Regex,下面這個例子是查找一個或多個數字字符的序列:

下一步,創建一個用來搜索的字符串樣例:

findFirstIn方法將找到第一個匹配結果:

注意,這個方法的返回值是Option[String]。
接下來看看尋找多個匹配時使用的findAllIn方法:

如上所示,findAllIn返回一個迭代器,可以在這個迭代器上循環訪問每一個匹配的結果:

如果findAllIn沒有找到任何結果,會返回一個空的迭代器,所以仍然可以調用其方法而不會拋出空指針異常。如果想將結果轉換成一個Vector,則只要在其后面繼續調用toVector即可:

如果沒有任何匹配,上面這種方式將產生一個空的Vector。其他方法如toList、toSeq和toArray在沒有任何匹配時也是可用的。
討論
在一個字符串上使用.r方法是創建一個Regex對象的最簡單的方法。另一種方法是導入Regex類,創建一個Regex實例,然后以同樣的方式使用該實例:

雖然這么做會需要更多的代碼,但是也更清晰明顯,因為我發現自己很容易忽視掉字符串末尾的.r(然后會花幾分鐘來搞清楚代碼竟然能正常工作的原因)。
關于findFirstIn的返回類型是Option的一些簡要討論
正如前面的解決方案里提到的,findFirstIn方法會找到例子中第一個匹配項然后返回Option[String]:

因為Option/Some/None模式將在24.6節介紹,所以這里不會詳細討論。Option簡單來說是一個容納0個或1個值的容器,在上面findFirstIn的例子里,如果它成功找到一個匹配,就會用Some把字符串"123"包起來,也就是Some("123")。如果在字符串中沒有找到任何匹配項,就會返回一個None:

總之,任何時候一個方法(a)被定義為返回Option[String],(b)保證不拋出異常,(c)保證終止(即不進入無限循環),它總是返回Some[String]或None。
另見
·請參閱Scala Regex類文檔(https://oreil.ly/rdiBW),了解更多使用正則表達式的方法。
·請參閱24.6節,了解如何處理Option值的細節。
- Web前端開發技術:HTML、CSS、JavaScript(第3版)
- VMware View Security Essentials
- jQuery Mobile Web Development Essentials(Third Edition)
- C語言程序設計案例教程(第2版)
- Visual C++串口通信技術詳解(第2版)
- 正則表達式經典實例(第2版)
- Visual C++數字圖像處理技術詳解
- JavaScript程序設計:基礎·PHP·XML
- Web App Testing Using Knockout.JS
- App Inventor少兒趣味編程動手做
- Getting Started with Python
- Learning Android Application Testing
- 零基礎學C++(升級版)
- MATLAB 2020 GUI程序設計從入門到精通
- Implementing NetScaler VPX?(Second Edition)