官术网_书友最值得收藏!

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值的細節。

主站蜘蛛池模板: 两当县| 扶绥县| 清涧县| 沅江市| 乡宁县| 内乡县| 兴义市| 中方县| 内乡县| 温州市| 苏州市| 沂南县| 仁寿县| 广汉市| 广州市| 杭锦旗| 阿拉善盟| 阳谷县| 普洱| 凤冈县| 海门市| 孟连| 南丹县| 乌兰浩特市| 宣化县| 贡觉县| 崇义县| 武定县| 公主岭市| 西吉县| 交口县| 巩义市| 乌苏市| 丰城市| 高碑店市| 六枝特区| 金湖县| 蓝山县| 如东县| 广饶县| 泗水县|