regexp/pattern_soundness_parens.rb
tests/_examples/regexp/pattern_soundness_parens.rb in the metorex repository.
# A pattern has to close every group it opens.
begin
Regexp.new("(hay(st)ack")
rescue RegexpError => error
puts(error.message)
end
begin
Regexp.new("hay)stack")
rescue RegexpError => error
puts(error.message)
end
# A group's name is a name, so it cannot open with a digit or a minus.
begin
Regexp.new("(?<1a>a)")
rescue RegexpError => error
puts(error.message)
end
begin
Regexp.new("(?<-a>a)")
rescue RegexpError => error
puts(error.message)
end
# Only the three letters that change how a pattern reads name an option to
# `Regexp.new`, whatever a literal may be written with.
begin
Regexp.new("Hi", "n")
rescue ArgumentError => error
puts(error.message)
end
p(Regexp.new("Hi", "mx").source)
Output:
end pattern with unmatched parenthesis: /(hay(st)ack/
unmatched close parenthesis: /hay)stack/
invalid group name <1a>: /(?<1a>a)/
invalid group name <-a>: /(?<-a>a)/
unknown regexp option: n
"Hi"