0

给定这个字符串:

stuff = "banana 11/12/2009 123"

如何在 ruby​​ .scan 调用中获取正则表达式以仅返回:

["123"]

在我使用过的 ruby​​ 中stuff.scan(/\b\d+\b/),但我意识到 \b 边界将反斜杠视为边界,因此我得到 ["11","12","2009","123"] 从该方法返回。我还需要扫描来处理以下内容,并且只返回 "123" :

stuff = "123 banana 11/12/2009"
stuff = "11/12/2009 banana 123"

有什么想法吗?:)

4

6 回答 6

2

你可以使用这个模式:

/(?<=\s|^)\d+(?=\s|$)/
于 2013-06-10T15:08:49.247 回答
2

您还可以使用:

(?<!\S)\d+(?!\S)

这相当于(但略短):

(?<=\s|^)\d+(?=\s|$)

那是\d+在它周围有空格的匹配,或字符串(或行)的开始/结束。

于 2013-06-10T15:15:04.073 回答
2

您还可以尝试使用更具可读性的拆分/选择解决方案,该解决方案仅在空格分隔的文本部分中查找数字。

stuff.split.select { |x| x =~ (/^\d+$/)}
于 2013-06-10T15:20:24.043 回答
1

负前瞻/后视

(?<!/)\b\d+\b(?!/)

如果您/用作分隔符,则为 Ruby 转义

(?<!\/)\b\d+\b(?!\/)

演示:http ://rubular.com/r/P9MjQ87csO

注意:如果你/一直使用正则表达式,那么我建议你看看改变你的分隔符。根据this dailyvim post,您可以这样做:

mystring =~ %r{(?<!/)\b\d+\b(?!/)}

再也不用担心正斜杠了。见倾斜牙签综合症

于 2013-06-10T15:14:12.340 回答
1

您希望在包含字符串的开头或结尾处有一个独立的三位数字符串:

/(?:^\d{3}\b|\b\d{3}$)/

这是正则表达式的证明

于 2013-06-10T15:43:01.230 回答
0

尝试否定 / 怎么样?

stuff.scan(/[^\/]*\d[^\/]*/)
于 2013-06-10T15:08:29.307 回答