# Regex capture and assign... in one line?

**URL:** <https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615>\
**Category:** Ruby\
**Created:** [November 7, 2006, 10:50am UTC](https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615 "2006-11-07T10:50:14Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![jashmenn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jashmenn](https://www.ruby-forum.com/u/jashmenn)\
**Post date:** [November 7, 2006, 10:50am UTC](https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615/1 "2006-11-07T10:50:14Z")

</div>

Question, I’ve been using Ruby for a while now and I have a perlism I  
kind of miss.

Given

$str = “foo123”;

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

# now we have

$foo; #=\> “foo”  
$bar; #=\> “123”

I know that I can do this in Ruby in TWO lines, but I want to do it in  
ONE line. Anyone have any ideas?

---

<div class="post-metadata">

**Author:** ![jashmenn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jashmenn](https://www.ruby-forum.com/u/jashmenn)\
**Post date:** [November 7, 2006, 10:50am UTC](https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615/2 "2006-11-07T10:50:15Z")

</div>

On 10/31/06, Nate M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> $foo; #=\> “foo”  
> $bar; #=\> “123”
> 
> I know that I can do this in Ruby in TWO lines, but I want to do it in  
> ONE line. Anyone have any ideas?

Something like:

foo, bar = “foo123”.match(/(\w+)(\d+)/).captures

p foo  
p bar

pth

---

<div class="post-metadata">

**Author:** ![jashmenn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jashmenn](https://www.ruby-forum.com/u/jashmenn)\
**Post date:** [November 7, 2006, 10:50am UTC](https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615/3 "2006-11-07T10:50:17Z")

</div>

On Tuesday October 31 2006 18:56, Patrick H. \<“Patrick H.”  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)\> wrote:

> > # now we have
> 
> Something like:
> 
> foo, bar = “foo123”.match(/(\w+)(\d+)/).captures

Better: foo, bar = “foo123”.match(/(\D+)(\d+)/).captures

---

<div class="post-metadata">

**Author:** ![jashmenn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jashmenn](https://www.ruby-forum.com/u/jashmenn)\
**Post date:** [November 7, 2006, 10:50am UTC](https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615/4 "2006-11-07T10:50:20Z")

</div>

Hi –

On Wed, 1 Nov 2006, Luiz Eduardo Roncato Cordeiro wrote:

> > > 
> > 
> > Something like:
> > 
> > foo, bar = “foo123”.match(/(\w+)(\d+)/).captures
> 
> Better: foo, bar = “foo123”.match(/(\D+)(\d+)/).captures

The problem with using captures in a single line like this is that if  
there’s no match, you’ll get an exception (NoMethodError for  
nil#captures). The to\_a technique, though it involves discarding the  
first value, avoids this problem.

David

---

<div class="post-metadata">

**Author:** ![jashmenn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jashmenn](https://www.ruby-forum.com/u/jashmenn)\
**Post date:** [November 7, 2006, 10:51am UTC](https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615/5 "2006-11-07T10:51:29Z")

</div>

Hello,

> I know that I can do this in Ruby in TWO lines, but I want to do it in  
> ONE line. Anyone have any ideas?

m, foo, bar = \*“foo123”.match(/(\D+)(\d+)/)

Regards,  
Andy S.

---

<div class="post-metadata">

**Author:** ![jashmenn](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/eb9ed0/32.png) [@jashmenn](https://www.ruby-forum.com/u/jashmenn)\
**Post date:** [November 7, 2006, 10:53am UTC](https://www.ruby-forum.com/t/regex-capture-and-assign-in-one-line/74615/6 "2006-11-07T10:53:17Z")

</div>

Nate M. wrote:

> $foo; #=\> “foo”  
> $bar; #=\> “123”
> 
> I know that I can do this in Ruby in TWO lines, but I want to do it in  
> ONE line. Anyone have any ideas?

str = “foo123”

foo, bar = str.split( /^(\D\*)/ )[1…-1]

foo, bar = str.scan( /\D+|\d+/ )
