Regex capture and assign... in one line?

$str = "foo123";

my ($foo,$bar) = $str =~ /(\w+)(\d+)/;

irb(main):001:0> str = "foo123"
=> "foo123"
irb(main):004:0> _,foo,bar = /(\w+)(\d+)/.match( str ).to_a
=> ["foo123", "foo12", "3"]

Perhaps you meant ([a-z]+), but that's obviously not the point.

···

From: Nate Murray [mailto:jashmenn@gmail.com]

Gavin Kistner wrote:

From: Nate Murray [mailto:jashmenn@gmail.com]
> $str = "foo123";
>
> my ($foo,$bar) = $str =~ /(\w+)(\d+)/;

irb(main):001:0> str = "foo123"
=> "foo123"
irb(main):004:0> _,foo,bar = /(\w+)(\d+)/.match( str ).to_a
=> ["foo123", "foo12", "3"]

And if you use this a lot, and can include your own mini-library stuff,
make it simpler:

  class Regexp
    def %( str )
      matches = match(str).to_a
      matches.shift
      matches
    end
  end

  foo, bar = /(\D+)(\d+)/ % "foo123"
  p foo, bar
  #=> "foo"
  #=> "123"

Or if you like it the other way around:
  class String
    def &( regexp )
      matches = regexp.match( self ).to_a
      matches.shift
      matches
    end
  end

  foo, bar = "foo123" & /(\D+)(\d+)/

I'm not sure if I like '%' better (ala modulo, as in "pare down my
string and give me whatever the regexp leaves"), or '&' better (ala set
intersection, as in "find whatever is common between this string and
regexp"). Up to you to pick from those, or choose another. Non-unary
operator methods left undefined in core Ruby for String and Regexp:

irb(main):002:0> NON_UNARY_OPERATOR_METHODS
=> ["", "=", "**", "~", "*", "/", "%", "+", "-", ">>", "<<", "&",
"^", "|", "<=", "<", ">", ">=", "<=>", "==", "===", "=~"]

irb(main):003:0> NON_UNARY_OPERATOR_METHODS - "".methods
=> ["**", "~", "/", "-", ">>", "&", "^", "|"]

irb(main):004:0> NON_UNARY_OPERATOR_METHODS - //.methods
=> ["", "=", "**", "*", "/", "%", "+", "-", ">>", "<<", "&", "^",
"|", "<=", "<", ">", ">=", "<=>"]

Phrogz wrote:

irb(main):002:0> NON_UNARY_OPERATOR_METHODS
=> ["", "=", "**", "~", "*", "/", "%", "+", "-", ">>", "<<", "&",
"^", "|", "<=", "<", ">", ">=", "<=>", "==", "===", "=~"]

irb(main):003:0> NON_UNARY_OPERATOR_METHODS - "".methods
=> ["**", "~", "/", "-", ">>", "&", "^", "|"]

irb(main):004:0> NON_UNARY_OPERATOR_METHODS - //.methods
=> ["", "=", "**", "*", "/", "%", "+", "-", ">>", "<<", "&", "^",
"|", "<=", "<", ">", ">=", "<=>"]

Er, of course '~' shouldn't be listed in the above, since it is an
unary operator.