如何使用正则表达式匹配字符或不匹配

not*_*off 18 ruby regex

我试图获取一些数字,这些数字可能会或可能不会有分频器,并以标准格式返回它们.以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

这已在评论中分享,但只是为了提供一个完整的答案......

您可以随意使用这些工具:

  • xx恰好匹配一次
  • x{a,b}匹配x之间ab时间
  • 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)