使用Ruby re模組建立複雜的Regex_ruby專題

來源:互聯網
上載者:User
例如,考慮下面的匹配日期的Regex:
複製代碼 代碼如下:
/\A((?:19|20)[0-9]{2})[\- \/.](0[1-9]|1[012])[\- \/.](0[1-9]|[12][0-9]|3[01])\z/

使用Re之後,Regex可以短小易讀的運算式為基礎,一步一步地構建出來,例如:
複製代碼 代碼如下:

require 're'

include 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構建Regex會很慢,所以推薦建立Regex並複用。匹配的時候,效能和原生的Regex很接近。(額外的方法調用和建立Re::Result以返回匹配結果影響一點點效能。)如果你需要追求極致的效能,你仍然可以使用Re來構建Regex,然後抽取出原始的Ruby Regexp來匹配。這樣的話,效能就和使用原生Regex一樣了。

例如,構建匹配電話號碼的Regex:

複製代碼 代碼如下:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.