我试图获取一些数字,这些数字可能会或可能不会有分频器,并以标准格式返回它们.以SSN为例:
ex1="An example 123-45-6789"
ex2="123.45.6789 some more things"
ex3="123456789 thank you Ruby may I have another"
Run Code Online (Sandbox Code Playgroud)
应该进入一个返回"123-45-6789"的方法基本上,除了数字或字母之外的任何东西(包括任何东西)都应该返回XXX-XX-XXXX格式的SSN.难倒的部分是一种通过正则表达式来识别不存在任何东西的方法.
到目前为止我在识别我的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
Run Code Online (Sandbox Code Playgroud)
当没有任何东西时,它似乎适用于我所期望的一切."123456789"不起作用.在这种情况下,我可以使用正则表达式来识别缺少什么吗?
Dan*_*Tao 42
这已在评论中分享,但只是为了提供一个完整的答案......
您可以随意使用这些工具:
x
x
恰好匹配一次x{a,b}
匹配x
之间a
和b
时间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}/
Run Code Online (Sandbox Code Playgroud)
use*_*140 10
您是否尝试在数字之间匹配0或1个字符?
\d{3}[^0-9a-zA-Z]{0,1}\d{2}[^0-9a-zA-Z]{0,1}\d{4}
Run Code Online (Sandbox Code Playgroud)