Skip to content

Commit

Permalink
Add Regex::CompileOptions::MULTILINE_ONLY (#14870)
Browse files Browse the repository at this point in the history
Crystal's `Regex` conflates the pcre options `MULTILINE` and `DOT_ALL` into `CompilerOptions::MULTILINE`.
This patch adds an option to use `MULTILINE` without `DOTALL`.

To keep backwards compatibility, the behaviour of `MULTILINE` in crystal must not be changed, so the new option is added as `MULTILINE_ONLY`.

---------

Co-authored-by: Sijawusz Pur Rahnama <sija@sija.pl>
Co-authored-by: Johannes Müller <straightshoota@gmail.com>
  • Loading branch information
3 people authored Oct 10, 2024
1 parent f237af0 commit b3a052c
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 2 deletions.
7 changes: 7 additions & 0 deletions spec/std/regex_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,13 @@ describe "Regex" do
end
end

describe "multiline_only" do
it "anchor" do
((/^foo.*$/m).match("foo\nbar")).try(&.[](0)).should eq "foo\nbar"
((Regex.new("^foo.*?", Regex::Options::MULTILINE_ONLY)).match("foo\nbar")).try(&.[](0)).should eq "foo"
end
end

describe "extended" do
it "ignores white space" do
/foo bar/.matches?("foobar").should be_false
Expand Down
5 changes: 5 additions & 0 deletions src/regex.cr
Original file line number Diff line number Diff line change
Expand Up @@ -240,12 +240,17 @@ class Regex
# flag that activates both behaviours, so here we do the same by
# mapping `MULTILINE` to `PCRE_MULTILINE | PCRE_DOTALL`.
# The same applies for PCRE2 except that the native values are 0x200 and 0x400.
#
# For the behaviour of `PCRE_MULTILINE` use `MULTILINE_ONLY`.

# Multiline matching.
#
# Equivalent to `MULTILINE | DOTALL` in PCRE and PCRE2.
MULTILINE = 0x0000_0006

# Equivalent to `MULTILINE` in PCRE and PCRE2.
MULTILINE_ONLY = 0x0000_0004

DOTALL = 0x0000_0002

# Ignore white space and `#` comments.
Expand Down
3 changes: 2 additions & 1 deletion src/regex/pcre.cr
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ module Regex::PCRE
if options.includes?(option)
flag |= case option
when .ignore_case? then LibPCRE::CASELESS
when .multiline? then LibPCRE::DOTALL | LibPCRE::MULTILINE
when .multiline? then LibPCRE::MULTILINE | LibPCRE::DOTALL
when .multiline_only? then LibPCRE::MULTILINE
when .dotall? then LibPCRE::DOTALL
when .extended? then LibPCRE::EXTENDED
when .anchored? then LibPCRE::ANCHORED
Expand Down
3 changes: 2 additions & 1 deletion src/regex/pcre2.cr
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ module Regex::PCRE2
if options.includes?(option)
flag |= case option
when .ignore_case? then LibPCRE2::CASELESS
when .multiline? then LibPCRE2::DOTALL | LibPCRE2::MULTILINE
when .multiline? then LibPCRE2::MULTILINE | LibPCRE2::DOTALL
when .multiline_only? then LibPCRE2::MULTILINE
when .dotall? then LibPCRE2::DOTALL
when .extended? then LibPCRE2::EXTENDED
when .anchored? then LibPCRE2::ANCHORED
Expand Down

0 comments on commit b3a052c

Please sign in to comment.