# Why is this regex invalid?

**URL:** <https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571>\
**Category:** Ruby\
**Created:** [December 6, 2006, 11:38pm UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571 "2006-12-06T23:38:47Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 6, 2006, 11:38pm UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/1 "2006-12-06T23:38:47Z")

</div>

irb(main):002:0\> regex = /([0-9]_)([^±]+)(._)/  
SyntaxError: compile error  
(irb):2: invalid regular expression: /([0-9]_)([^±]+)(._)/  
from (irb):2

irb(main):003:0\> regex = /([0-9]_)([^+ -]+)(._)/  
=\> /([0-9]_)([^+ -]+)(._)/

The only thing that it different in the 2 regexps is the placement of  
the space in the square brackets, yet the first regexp is invalid and  
the 2nd valid.

Why is this?

Thanks,  
Dan

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 6, 2006, 11:44pm UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/2 "2006-12-06T23:44:48Z")

</div>

On Thu, 7 Dec 2006 07:38:10 +0900, Daniel F.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> the 2nd valid.
> 
> Why is this?

When an unescaped - appears in any position but the first or final one  
inside brackets, it is interpreted as a range separator rather than a  
literal ‘-’. Apparently '+- ’ isn’t a valid range.

-mental

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 6, 2006, 11:44pm UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/3 "2006-12-06T23:44:48Z")

</div>

On 12/6/06, Daniel F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> the 2nd valid.
> 
> Why is this?
> 
> Thanks,  
> Dan

It’s the placement of the - that makes a difference. In a character  
class, - between two characters denotes a range. So the first  
character class includes a range, from + to , which is invalid  
because + comes after space in the relevant character encoding.

If you want a literal hyphen in a character class, it’s safest to make  
it the last character.

-A

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 6, 2006, 11:46pm UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/4 "2006-12-06T23:46:49Z")

</div>

On 12/6/06, Daniel F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> the 2nd valid.

The hyphen in the middle expression is ambiguous, because it could  
either be a range or a literal.  
One way is to rearrange the order so that it comes first:  
/([0-9]_)([^-+]+)(._)/

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 6, 2006, 11:46pm UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/5 "2006-12-06T23:46:49Z")

</div>

I’m pretty sure the dash needs to be escaped in regular expressions.  
The second one works since it is the last character in the character  
class, and hence isn’t defining a range.

/([0-9]_)([^+-]+)(._)/ should work - note the escaped dash.

-Chris Schneider

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 7, 2006, 1:27am UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/6 "2006-12-07T01:27:01Z")

</div>

Christopher S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> I’m pretty sure the dash needs to be escaped in regular expressions.  
> The second one works since it is the last character in the character  
> class, and hence isn’t defining a range.
> 
> /([0-9]_)([^+-]+)(._)/ should work - note the escaped dash.

Rubbish. In character ranges, \ is not special.

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 6, 2006, 11:48pm UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/7 "2006-12-06T23:48:50Z")

</div>

Daniel F. wrote:

> the 2nd valid.
> 
> Why is this?
> 
> Thanks,  
> Dan

Hi,

‘-’ shuld be escaped like this.  
regex = /([0-9]_)([^+-]+)(._)/

Jun

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 7, 2006, 6:01am UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/8 "2006-12-07T06:01:27Z")

</div>

On Thu, 07 Dec 2006 01:24:30 +0100, David K. wrote:

> Christopher S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:
> 
> > I’m pretty sure the dash needs to be escaped in regular expressions.  
> > The second one works since it is the last character in the character  
> > class, and hence isn’t defining a range.
> > 
> > /([0-9]_)([^+-]+)(._)/ should work - note the escaped dash.
> 
> Rubbish. In character ranges, \ is not special.

It most certainly is special:  
irb(main):014:0\> /[a+-]/=~“.\”  
=\> nil

---

<div class="post-metadata">

**Author:** ![arachnd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/278dde/32.png) [@arachnd](https://www.ruby-forum.com/u/arachnd)\
**Post date:** [December 7, 2006, 2:31am UTC](https://www.ruby-forum.com/t/why-is-this-regex-invalid/78571/9 "2006-12-07T02:31:07Z")

</div>

> > /([0-9]_)([^+-]+)(._)/ should work - note the escaped dash.
> 
> Rubbish. In character ranges, \ is not special.

A rubbish upon your rubbish. \ are special pretty much anywhere.  
Otherwise how would you match all chars except a ‘]’ ?

irb(main):007:0\> /([0-9]_)([^±]+)(._)/.match(‘44dads’)[0…-1]  
=\> [“44dads”, “44”, “dads”, “”]  
irb(main):008:0\> /([0-9]_)([^±]+)(._)/.match(‘44-dads’)[0…-1]  
=\> [“44-dads”, “4”, “4”, “-dads”]  
irb(main):009:0\> /([0-9]_)([^±]+)(._)/.match(‘44-dads’)[0…-1]  
SyntaxError: compile error  
(irb):9: invalid regular expression: /([0-9]_)([^±]+)(._)/  
from (irb):9  
irb(main):010:0\> /([0-9]_)([^±]+)(._)/.match(‘44\dads’)[0…-1]  
=\> [“44\dads”, “44”, “\dads”, “”]
