使用Ruby re模組建立複雜的正規表示式

2022-10-06 00:30:19 字數 1690 閱讀 1796

例如,考慮下面的匹配日期的正規表示式:

複製** **如下:

/\a((?:19|20)[0-9])[\- \/.](0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])\z/

使用re之後,正規表示式可以短小易讀的表示式為基礎,一步一步地構建出來,例如:

複製** **如下:

require 're'

lipcoqshwkinclude re

delim                = re.any("- /.")

century_prefix       = re("19") | re("20")

under_ten            = re("0") + re.any("1-9")

ten_to_twelve      程式設計客棧;  = re("1") + re.any("012")

ten_and_under_thirty = re.any("12") + re.any("0-9")

thirties             = re("3") + re.any("01")

year = (century_prefix + re.digit.repeat(2)).capture(:year)

month = (under_ten | ten_to_twelve).capture(:month)

day = (under_ten | ten_and_under_thirty | thirties).capture(:day)

date = (year + delim + month + delim + day).all

雖然**量增加了,但是每個部分都很短小,也很容易驗證。同時,捕獲的部分可以通過相應的變數名訪問:

複製** **如下:

result = date.match("2009-01-23")

result[:year]      # => "2009"

result[:month]     # => "01"

result[:day]       # => "23"

注意,用re構建正規表示式會很慢,所以推薦建立正規表示式並復用。匹配的時候,效能和原生的正規表示式很接近lipcoqshwk。(額外的方法呼叫和lipcoqshwk建立re::result以返回匹配結果影響一點點效能。)如果你需要追求極致的效能,你仍然可以使用re來構建正規表示式,然後抽取出原始的ruby regexp來匹配。這樣的話,效能就和使用原生正規表示式一樣了。

例如,構建匹配**號碼的正規表示式:

複製** **如下:

phone_re = re.digit.repeat(3).capture(:area) +

re("-") +

程式設計客棧            re.digit.repeat(3).capture(:exchange) +

re("-") +

re.digit.repeat(4)).capture(:subscriber)

然後抽取出原始的正則物件,直接使用它來匹配:

複製** **如下:

phone_regexp = phone_re.regexp

if phone_regexp =~ string

# blah blah blah

end

本文標題: 使用ruby re模組建立複雜的正規表示式

本文位址:

Python 模組的建立和使用

1.模組的建立 模組 module 模組化,模組化指將乙個完整的程式分解為乙個乙個小的模組 通過將模組組合,來搭建出乙個完整的程式 不採用模組化,統一將所有的 編寫到乙個檔案中 採用模組化,將程式分別編寫到多個檔案中 模組化的優點 方便開發 方便維護 模組可以復用!在python中乙個py檔案就是乙...

repeater建立複雜的表頭

repeater建立複雜表頭的 文章指數 0 csdn blog推出文章指數概念,文章指數是對blog文章綜合評分後推算出的,綜合評分項分別是該文章的點選量,回覆次數,被網摘收錄數量,文章長度和文章型別 滿分100,每月更新一次。gridview的功能雖然強大,但在建立複雜表頭報表時卻顯得遜色許多。...

yii2 模組的建立及使用

yii2 模型建立可以通過gii工具建立,方便快速 yii2 可以在專案的根目錄建立乙個modules資料夾存放各個模組,當然,每個模組裡還可以再建立模組 一.直接在專案根目錄建立乙個模組 看截圖 然後點選 preview 預覽 generate 生成 即可生成payment模組 此時別忘了乙個操作...