从字符串中提取数字和斜杠

时间:2017-03-30 17:38:25

标签: ruby

我有以下字符串

Policy 023203232/02/05 saved successfully

我需要从上面的字符串中提取023203232/02/05并编写以下代码

puts a[/\d+\/\d+\/\d+/]

它工作正常。但是,如果数字随着斜杠增加,023203232/02/05/06我必须再包含一个\d+,但我不知道有多少斜杠和数字会以这种方式重复,所以任何人都可以建议我写一下一些通用解决方案

如果字符串是

Policy 023203232/02/05 saved successfully

然后

023203232/02/05

如果字符串是

Policy 023203232/02/05/06 saved successfully

然后

023203232/02/05/06

如果字符串是

Policy 023203232/02/05/06/08 saved successfully

然后

023203232/02/05/06/08

如何编写这样的通用正则表达式?

3 个答案:

答案 0 :(得分:2)

假设连续的数字和斜线(即中间没有空格),这应该有效:

{{1}}

答案 1 :(得分:1)

这个查找一系列数字或斜杠:

str = "Policy 023203232/02/05/07/3434343/56 saved successfully 09/56/3"
p str.match(/[0-9\/]+/)[0] # => "023203232/02/05/07/3434343/56"

答案 2 :(得分:1)

这个正则表达式应该是你想要的:

/(\d+\/?)+/

这意味着:

  • 至少有一种模式:
    • 至少一位数
    • 可能后跟/

它应该比其他答案更强大:

"Policy 023203232/02/05/06/08 saved successfully"[/(\d+\/?)+/]
# => "023203232/02/05/06/08"
"Policy 023203232/02/05/07/3434343/56 saved successfully 09/56/32"[/(\d+\/?)+/]
# => "023203232/02/05/07/3434343/56"
"Policy // // 023203232/02/05/07/3434343/56 saved successfully 09/56/32"[/(\d+\/?)+/]
# => "023203232/02/05/07/3434343/56"

如果您想确保该号码在“政策”之后,但又不想让'Policy '在您的匹配中,您可以使用positive look-behind

/(?<=Policy )(\d+\/?)+/

这里有效:

"2017/03/31 Policy 023203232/02/05/07/3434343/56 saved successfully"[/(?<=Policy )(\d+\/?)+/]
# => "023203232/02/05/07/3434343/56"