2014-01-12 13 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" 

はすべて基本的には、数字または文字を除いて(何も含まない)何がXXX-XX-にSSNを返すべき「123-45-6789」を返すメソッドに入る必要がありますXXXX形式。突き詰めている部分は、何も存在しないことを識別するための正規表現への方法です。私が何もない場合を除き、期待にすべてのために働くようだ

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 

:私は私のSSNを特定するには、これまで持ってい

。 "123456789"は機能しません。この場合、正規表現を使用して何か不足を識別できますか?

答えて

5

数字の間に0文字または1文字を一致させようとしましたか?

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

私は自分の答えを見つけたようですが、改善の手がかりが役立ちます。

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

現在の正規表現では、すべての種類のUnicode文字と制御文字はもちろん、123-45[6789も許可されます。極端な場合:

123 
45師6789 

はあなたの正規表現と一致すると見なされます。

逆参照を使用して、区切り記号が同じであることを確認できます。

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

[.-]?.-または(オプション?数量詞による)何もどちらかと一致します。ここにマッチしたものは、逆参照によって第2セパレータが同じであることを確認するために使用されます。

30

これはすでにコメントで共有されていますが、完全なishの回答を提供するために...

あなたはあなたの処分で、これらのツールを持っている:

  • x試合x正確に一度
  • x{a,b}試合abx
  • x{a,}試合x少なくともa
  • x{,b}試合x (最大)までb
  • x*マッチx 0回以上
  • x+マッチx一回以上(x{1,}と同じ)
  • x?マッチx0または1時間(同じx{0,}として)x{0,1}と同じ)

だから、それはあなたが探しているものなので、最後のものを使いたいゼロまたは1回)。

/\d{3}[^0-9a-zA-Z]?\d{2}[^0-9a-zA-Z]?\d{4}/ 
関連する問題