子串以数字组合开始,直到下一个空格

时间:2014-11-04 20:06:00

标签: ruby ruby-on-rails-4 string-matching

我有一个很长的字符串,大约有2000个字符。字符串是段的连接​​,每个段的前两个字符作为段指示符。

Eg-' 11xxxxx 12yyyy 14dddd gghgfbddc 0876686589 SANDRA COLINS 201 STMONK CA'

现在我想用指标14提取段。

我用以下方法实现了这个目标:

str.split(' ').each do |substr|

  if substr.starts_with?('14')

     key = substr.slice(2,5).to_i 

     break

  end

end

我觉得应该有更好的方法来做到这一点。我无法在ruby中找到更直接和一行的字符串匹配解决方案。请有人建议更好的方法。

1 个答案:

答案 0 :(得分:1)

您并不完全清楚自己在寻找什么,因为您的示例字符串会显示字母,但您的标题会显示数字。无论哪种方式,这对于正则表达式来说都是一项很好的任务。

foo = '12yyyy 014dddd 14ddddd gghgfbddc'
bar = '12yyyy 014dddd 1499999 gghgfbddc'
baz = '12yyyy 014dddd 14a9B9z gghgfbddc'

foo[/\b14[a-zA-Z]+/] # => "14ddddd"
bar[/\b14\d+/] # => "1499999"
baz[/\b14\w+/] # => "14a9B9z"

foo[/\b14\S+/] # => "14ddddd"
bar[/\b14\S+/] # => "1499999"
baz[/\b14\S+/] # => "14a9B9z"

在模式中:

  • \b表示分词,因此模式必须从空格或标点符号之间的过渡开始。
  • [a-zA-Z]+表示一个或多个字母。
  • \d+表示一个或多个数字。
  • \w+表示一个或多个字母,数字和'_'。这相当于字符集[a-zA-Z0-9_]+
  • \S+表示非空格,如果您希望所有内容都占用空间,则非常有用。

哪些适合您的用例由您决定。