2014-01-12 78 views
14

我試圖採取一個數字塊,可能會或可能不會有分隔符並以標準格式返回它們。使用SSN爲例:如何匹配字符或沒有使用正則表達式

ex1="An example 123-45-6789" 
ex2="123.45.6789 some more things" 
ex3="123456789 thank you Ruby may I have another" 

都應該進入返回「123-45-6789」的方法基本上,任何事情(包括什麼都沒有),除了數字或字母應以XXX-XX-返回SSN XXXX格式。正在傾倒的部分是通過正則表達式來識別不存在的方式。

我有什麼在確定我的SSN至今:

def format_ssns(string) 
    string.scan(/\d{3}[^0-9a-zA-Z]{1}\d{2}[^0-9a-zA-Z]{1}\d{4}/).to_a 
end 

它似乎一切我想到時候有什麼除了工作還是工作。 「123456789」不起作用。在這種情況下,我可以使用正則表達式來識別缺少任何東西嗎?

回答

5

您是否嘗試過在數字之間匹配0或1個字符?

\d{3}[^0-9a-zA-Z]{0,1}\d{2}[^0-9a-zA-Z]{0,1}\d{4} 
0

Whelp ...看起來像我剛剛找到我自己的答案,但任何改進線索都會有所幫助。

def format_ssns(string) 
    string.scan(/\d{3}[^0-9a-zA-Z]{0,1}\d{2}[^0-9a-zA-Z]{1}\d{4}/).to_a 
end 

似乎要做的伎倆。

+2

'{1}'完全是多餘的,'{0,1}'與'?'完全相同,這可能是您的問題的答案。 – tripleee

+1

實際上,如果您有'{1}',您可能也指'''。 – tripleee

2

你目前的正則表達式將允許123-45[6789,更不用說各種Unicode字符和控制字符。在極端情況下:

123 
45師6789 

被認爲是由您的正則表達式匹配。

您可以使用反向引用來確保分隔符相同。

/\d{3}([.-]?)\d{2}\1\d{4}/ 

[.-]?將匹配.-或沒有(由於可選?量詞)。無論這裏匹配什麼,都可以通過反向引用來確保第二個分隔符是相同的。

30

這已在評論中共享,但只是爲了提供完整的答案...

您在您的處置有這些工具:

  • x比賽x恰好一次
  • x{a,b}比賽ab之間x
  • x{a,}比賽x至少a
  • x{,b}比賽x達(最大)b
  • x*匹配x零次或多次(同x{0,}
  • x+匹配x一次或多次(同x{1,}
  • x?匹配x零次或一次(同x{0,1}

所以你要使用最後一個,因爲它是你在尋找什麼(零次或一次)。

/\d{3}[^0-9a-zA-Z]?\d{2}[^0-9a-zA-Z]?\d{4}/ 
相關問題