ActiveRecord's validation system puts other database systems to shame.
However, the newbies might not know how to write a regexp that
excludes a match, instead of tests for it. Understand - I'm just
asking this question to help them. I have been using Regexps since
'grep' on Xenix! But the newbies here might not know how to do this:
That passes on the first non-\n character. /^[^\n]+$/ doesn't work
either. (Trying for "all characters between start and end not \n".)
New question: Why don't any variations of Regexp have a bulk negation
operator? Most applications can rely on !~.
When we can't use that, or when we must negate a subset of a regexp,
the result is super-ugly. The contrapositive of /\n/ should be just as
clean-looking, right?
so you wanted this then?
validates_format_of :field_must_not_break, :with => /^[^\n]*$/
assert_match /^[^\n]+$/, "kozmik\nbullfrog"
That assertion passes - we want it to fail.
Next, there are two questions afloat - how to validate (without
resorting to validate(), on principle), and whether all regexp
libraries everywhere have a big gap.
You can't pass a validating block to validates_exclusion_of; only a
proc to determine if the validation should take place. It gets passed
the model, so we could put the 'not str.includes?' in there, but
that's much more code than simply using a validate().
And 'not str.includes?' doesn't answer the philosophical question
about regexps!
Are you looking for a field with only one character [which can’t be a newline]? 'Cause that’s what /[1]$/ does. You might want to add some wildcardier metacharacters to include more possible characters than just one.
Or you might just want to ask this question over and over.
Are you looking for a field with only one character [which can't be a
newline]? 'Cause that's what /^[^\n]$/ does. You might want to add some
wildcardier metacharacters to include more possible characters than just
one.
Wrong.
Or you might just want to ask this question over and over.
Um… That’s actually right. [About the friggin’ regex].
rsl@sneaky:~$ irb
irb(main):001:0> rx = /^a$/
=> /^a$/
irb(main):002:0> “test” =~ rx
=> nil # Doesn’t have an “a”
irb(main):003:0> “tast” =~ rx
=> nil # Has an “a” but has other characters as well
irb(main):004:0> “a” =~ rx
=> 0 # Surprise! It passes there because it has only “a”
irb(main):005:0> rx = /[1]$/
=> /[2]$/
irb(main):006:0> “\n” =~ rx
=> nil # Fails on returns, as expected
irb(main):007:0> “” =~ rx
=> nil # Fails on empty string
irb(main):008:0> “1” =~ rx
=> 0 # Passes because there’s only one character
irb(main):009:0> “11” =~ rx
=> nil # Fails because there’s more than one character
[
Um… That’s actually right. [About the friggin’ regex].
Sorry, it’s not.
rsl@sneaky:~$ irb
irb(main):001:0> rx = /^a$/
=> /^a$/
irb(main):002:0> “test” =~ rx
=> nil # Doesn’t have an “a”
irb(main):003:0> “tast” =~ rx
=> nil # Has an “a” but has other characters as well
irb(main):004:0> “a” =~ rx
=> 0 # Surprise! It passes there because it has only “a”
irb(main):005:0> rx = /[1]$/
=> /[2]$/
irb(main):006:0> “\n” =~ rx
=> nil # Fails on returns, as expected
irb(main):007:0> “” =~ rx
=> nil # Fails on empty string
irb(main):008:0> “1” =~ rx
=> 0 # Passes because there’s only one character
irb(main):009:0> “11” =~ rx
=> nil # Fails because there’s more than one character
Well, snap on my doodle! I was so busy hoping I could give Phlip a heaping bowl of his own brand of snotty reply that I tripped on some of my own brand of over-confidence. Crow meet plate, fork, and knife. [Again.]
I’m still trying to wrap my head around this. I think of “a\nb” as a string containing three characters, a, the newline character, and b. Oh, I think I see… ^ and $ don’t match the end and beginning of a string but the end and beginning of a line… Sigh. Goddangit. Rassin’ frassin’.
Oh well. Apologies to Phlip, I’m fully prepared for and deserving of your next snarky retort. [But not the one after that.]