Kerozu
Kerozu

Reputation: 673

Match a word with backslash

I am struggling to write a Ruby regexp that will match all words which: starts with 2 or 3 letters, then have backslash (\) and then have 7 or 8 letters and digits. The expression I use is like this:

p "BFD\082BBSA".match %r{\A[a-zA-Z]{2,3}\/[a-zA-Z0-9]{7,8}\z}

But each time this code returns nil. What am I doing wrong?

Upvotes: 1

Views: 100

Answers (3)

Arup Rakshit
Arup Rakshit

Reputation: 118289

Try as below :

'BFD\082BBSA'.match %r{\A[a-zA-Z]{2,3}\\[a-zA-Z0-9]{7,8}\z} 
 # => #<MatchData "BFD\\082BBSA">
 #or
"BFD\\082BBSA".match %r{\A[a-zA-Z]{2,3}\\[a-zA-Z0-9]{7,8}\z}
 # => #<MatchData "BFD\\082BBSA">

Read this also - Backslashes in Single quoted strings vs. Double quoted strings in Ruby?

Upvotes: 4

toro2k
toro2k

Reputation: 19238

The problem is that you actually have no backslash in your string, just a null Unicode character:

"BFD\082BBSA"
# => "BFD\u000082BBSA"

So you just have to escape the backslash in the string:

"BFD\\082BBSA"
# => "BFD\\082BBSA"

Moreover, as others pointed out, \/ will match a forward slash, so you have to change \/ into \\:

"BFD\\082BBSA".match(/\A[a-z]{2,3}\\[a-z0-9]{7,8}\z/i)
# => #<MatchData "BFD\\082BBSA">

Upvotes: 2

thefourtheye
thefourtheye

Reputation: 239573

You wanted to match the backward slash, but you are matching forward slash. Please change the RegEx to

[a-zA-Z]{2,3}\\[a-zA-Z0-9]{7,8}

Note the \\ instead of \/. Check the RegEx at work, here

Upvotes: 1

Related Questions