Issue #5588 has been updated by Yui NARUSE.

Category set to core
Status changed from Open to Assigned
Assignee set to Yui NARUSE
Target version set to 2.0.0

Thank you for detailed explanation,
And sorry, [ruby-core:40932] explains it.
I believe this spec is wrong; (?v:foo) should match a sequence which doesn't include "foo".
OR a sequence just match "foo".

For example, /"(?v:<|&|")"/, AttValue of XML http://www.w3.org/TR/xml/#NT-AttValue
The behavior of this regexp seems /"[^<&"]*"/ but

irb(main):007:0> /"[^<&"]*"/=~'"aa<&a"'
=> nil
irb(main):008:0> /"(?v:<|&|")"/=~'"aa<&a"'
=> 0

This feels strange.

Do you have any use case which show current behavior is more reasonable?
----------------------------------------
Feature #5588: add negation flag (v) to Regexp
http://redmine.ruby-lang.org/issues/5588

Author: Suraj Kurapati
Status: Assigned
Priority: Normal
Assignee: Yui NARUSE
Category: core
Target version: 2.0.0


Please add a negation flag (v) to regexps which inverts them:

  "ruby" =~ /perl/v       #=> true   (turn on negation)
  "ruby" !~ /perl/v       #=> false  (turn on negation)
  "ruby" =~ /(?v:perl)/   #=> true   (turn on negation)
  "ruby" !~ /(?v:perl)/   #=> false  (turn on negation)
  "ruby" =~ /(?-v:perl)/  #=> false  (turn off negation)
  "ruby" !~ /(?-v:perl)/  #=> true   (turn off negation)

The flag name "v" comes from the ex(1) command of the same name.

This has beneficial applications where it is sometimes difficult
to construct what you want to match but much easier to construct
what you *do not* want to match.  Having this negation built in
the regexp itself would remove the need for us to change our 
Ruby code to process a regexp in a different way.  

For example, suppose that you are passing a regexp to the `--name`
command-line option of MiniTest.  This regexp tells MiniTest to
only run those tests whose names match.  If Ruby had a negation
flag on its regexps, then it would be suddenly trivial to make
MiniTest skip certain tests by negating the regexp we pass in.

In this manner, we get a beneficial feature without ever changing
our Ruby code (the codebase of MiniTest in this example).  :-)

Thanks for your consideration.


-- 
http://redmine.ruby-lang.org