2015-04-30 294 views
3

我要檢查這個正則表達式一個字符串是否是格式日,兩個或三個點,日期乾紅寶石正則表達式?

/\A(\d{1,2}-\d{1,2}-\d{4})...?(\d{1,2}-\d{1,2}-\d{4})\z/

正如你所看到的,日期匹配組\d{1,2}-\d{1,2}-\d{4}重複的。

是否有一種正則表達式原生或一般的ruby編程方式將這個組分配給一個變量,然後在正則表達式中使用它,而不是真正的組,給我一些像/\A<var>...?<var>\z/

謝謝!

+1

你的意思是這樣的:http://stackoverflow.com/questions/2268421/ruby-regular-expression-using-variable-name? –

+0

這一點太混亂了,Roney Michael的回答涵蓋了我所需要的。 – Epigene

+0

檢查他的答案後,我仍然相信這些是重複的。此外,你說*兩個或三個點*,而Roney Michael使用'/ \ A(#{re1})...?(#{re1})\ z /'而不是'/ \ A(#{re1} )\ {2,3}(#{RE1})\ Z /'。 '.'匹配任何字符*和'\ .'匹配一個文字週期。我沒有想到在字符類中添加單個速記字符類(例如'\ w +'就足夠了''[\ w] +')。 –

回答

1

正則表達式連接應該做的伎倆。

從討論here

irb(main):001:0> re1 = re1 = /[\w]+/ 
=> /[\w]+/ 
irb(main):002:0> re2 = /[\d]+/ 
=> /[\d]+/ 
irb(main):003:0> re3 = /#{re1}[\s]+#{re2}/ 
=> /(?-mix:[\w]+)[\s]+(?-mix:[\d]+)/ 
irb(main):004:0> "Foo 123".match(re3).to_s 
=> "Foo 123" 

爲您的代碼具體爲:

irb(main):001:0> re1 = /\d{1,2}-\d{1,2}-\d{4}/ 
=> /\d{1,2}-\d{1,2}-\d{4}/ 
irb(main):002:0> re2 = /\A(#{re1})...?(#{re1})\z/ 
=> /\A((?-mix:\d{1,2}-\d{1,2}-\d{4}))...?((?-mix:\d{1,2}-\d{1,2}-\d{4}))\z/ 

..和然後根據需要使用RE2。

+1

正則表達式連接ftw! – Epigene

1

您可以定期紅寶石做

date_regex = /\d{1,2}-\d{1,2}-\d{4}/ 
/\A(#{date_regex})...?(#{date_regex})\z/