2012-06-28 93 views
1

什麼是正則表達式只允許破折號和數字?只允許破折號和數字的正則表達式?

一個很好的例子是在電話號碼中使用。例如555-555-555,12-2314-425。

我不希望這樣的條目,如:-------------雖然但-34--53-343現在罰款。

+2

正則表達式沒有內存,如果所有點都可以被任何一個點佔用,則不能保證數字在短劃線之間。 – TheZ

+1

@TheZ Ruby和其他動態語言正則表達式肯定是「有回憶」(http://www.ruby-doc.org/core-1.9.3/Regexp.html#label-Capturing)。一個不需要「記憶」來使正則表達式匹配這個問題的期望行爲,請參閱下面的答案。 – dbenhur

回答

6

所以作爲規定的問題,你至少需要一個數字,但另有0-9或破折號任何。

/^[\d-]*\d[\d-]*$/ 

%w{555-555-555 12-2314-425 -34--53-343 -------------}.each{|s| puts "#{s} #{s.match(/^[\d-]*\d[\d-]*$/) ? 'does' : 'does not'} match"} 

555-555-555 does match 
12-2314-425 does match 
-34--53-343 does match 
------------- does not match 

如果你想認識的電話號碼,你可能想要的東西,承認任選被單短線分開的數字序列,試試這個來代替:

/^\d+(?:-\d+)*$/ 

不包括開頭或結尾的破折號和雙破折號。

+0

+1:刪除了我的答案,意識到它和這個相同,除了你用'\ d'。這是[鏈接](http://rubular.com/r/IX1r3vaH9N),以查看您的工作。 – Windle

+0

那麼,如果他們決定不使用破折號也不錯。我想一個更準確的說法是,他們只能有數字或破折號。 – LearningRoR

3

不知道紅寶石,但我相信正則表達式是:

/^[0-9]([0-9]|-(?!-))+$/ 
  1. 以數字開頭,
  2. 其次是一個數字,或不是由破折號破折號。可能多次(555-54-456是有效的,555--54-456不是)
+0

他的示例可接受字符串之一以短劃線開頭。 – dbenhur

+0

是的,但我現在假設用_'fine'_我認爲OP的含義是:_'會很好地接近,但在這一點上還不是絕對必要的'。由於這些是電話號碼,你是否看到了用於開始衝刺或重複衝刺的用途?我試圖用電話號碼回答,而不是抽象的案例。 – Wrikken

相關問題