Rails SQL regular expression Rails SQL regular expression sqlite sqlite

Rails SQL regular expression


On Rails 4+ with a Postgres database the general form of a RegEx query is:

Model.where("column ~* ?", 'regex')

As for the regex, it can be a general '^A\d+$' or more specific '^A\d{4}$'Breaking it down:

^ - string start anchorA - literal "A"\d+ - one or more digits (0-9)\d{4} - exactly four digits$ - string end anchor

Basically, the regex reads "the string should start with an A, followed by four digits and then the string should end".The final query line is:

@max_draw = Drawing.where("drawing_number ~* ?", '^A\d{4}$')

Further reading on ruby RegEx at RubyDoc or the more accessible Perl variant (used by Sublime text)


You did a good job! The thing missing was the REGEXP function which is used for regex in queries:

So in your case use

Drawing.where("drawing_number REGEXP ?", 'A\d{4}')# the {4} defines that there have to be exactly 4 numbers, change if you need to

In SQL you use the '-colons, which is weird because you normally start regex with /-backslashes


You can't use regular expressions in SQL which is what you're trying to do. Your best bet would be to select just the entries that start with A like your original code, then skip entries that have more than one letter at the beginning.

items = Drawing.where( [ 'drawing_number LIKE ?' , 'A%' ] )max_value = 0items.each do |item|  next if item.drawing_number =~ /\A[A-Za-z]{2,}/  drawing_number = item.drawing_number.gsub(/\AA/, '').to_i  max_value = drawing_number if drawing_number > max_valueend

I'm reasonably certain it's possible to get this shorter but this should do what you need.

(\A is the start of line anchor that works with strings containing newlines)

({2,} matches two or more of the proceeding character range)

http://www.rubular.com/ is awesome for testing ruby regexes.