Add \D, \S, \w, \W special character classes
This commit is contained in:
parent
5b243507cf
commit
5486e5f138
@ -141,6 +141,11 @@ class Propane
|
|||||||
CharacterRangeUnit.new("\b")
|
CharacterRangeUnit.new("\b")
|
||||||
when "d"
|
when "d"
|
||||||
CharacterRangeUnit.new("0", "9")
|
CharacterRangeUnit.new("0", "9")
|
||||||
|
when "D"
|
||||||
|
ccu = CharacterClassUnit.new
|
||||||
|
ccu << CharacterRangeUnit.new("0", "9")
|
||||||
|
ccu.negate = true
|
||||||
|
ccu
|
||||||
when "f"
|
when "f"
|
||||||
CharacterRangeUnit.new("\f")
|
CharacterRangeUnit.new("\f")
|
||||||
when "n"
|
when "n"
|
||||||
@ -156,10 +161,35 @@ class Propane
|
|||||||
ccu << CharacterRangeUnit.new("\f")
|
ccu << CharacterRangeUnit.new("\f")
|
||||||
ccu << CharacterRangeUnit.new("\v")
|
ccu << CharacterRangeUnit.new("\v")
|
||||||
ccu
|
ccu
|
||||||
|
when "S"
|
||||||
|
ccu = CharacterClassUnit.new
|
||||||
|
ccu << CharacterRangeUnit.new(" ")
|
||||||
|
ccu << CharacterRangeUnit.new("\t")
|
||||||
|
ccu << CharacterRangeUnit.new("\r")
|
||||||
|
ccu << CharacterRangeUnit.new("\n")
|
||||||
|
ccu << CharacterRangeUnit.new("\f")
|
||||||
|
ccu << CharacterRangeUnit.new("\v")
|
||||||
|
ccu.negate = true
|
||||||
|
ccu
|
||||||
when "t"
|
when "t"
|
||||||
CharacterRangeUnit.new("\t")
|
CharacterRangeUnit.new("\t")
|
||||||
when "v"
|
when "v"
|
||||||
CharacterRangeUnit.new("\v")
|
CharacterRangeUnit.new("\v")
|
||||||
|
when "w"
|
||||||
|
ccu = CharacterClassUnit.new
|
||||||
|
ccu << CharacterRangeUnit.new("_")
|
||||||
|
ccu << CharacterRangeUnit.new("0", "9")
|
||||||
|
ccu << CharacterRangeUnit.new("a", "z")
|
||||||
|
ccu << CharacterRangeUnit.new("A", "Z")
|
||||||
|
ccu
|
||||||
|
when "W"
|
||||||
|
ccu = CharacterClassUnit.new
|
||||||
|
ccu << CharacterRangeUnit.new("_")
|
||||||
|
ccu << CharacterRangeUnit.new("0", "9")
|
||||||
|
ccu << CharacterRangeUnit.new("a", "z")
|
||||||
|
ccu << CharacterRangeUnit.new("A", "Z")
|
||||||
|
ccu.negate = true
|
||||||
|
ccu
|
||||||
else
|
else
|
||||||
CharacterRangeUnit.new(c)
|
CharacterRangeUnit.new(c)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -97,9 +97,15 @@ class Propane
|
|||||||
end
|
end
|
||||||
def <<(thing)
|
def <<(thing)
|
||||||
if thing.is_a?(CharacterClassUnit)
|
if thing.is_a?(CharacterClassUnit)
|
||||||
|
if thing.negate
|
||||||
|
CodePointRange.invert_ranges(thing.map(&:code_point_range)).each do |cpr|
|
||||||
|
CharacterRangeUnit.new(cpr.first, cpr.last)
|
||||||
|
end
|
||||||
|
else
|
||||||
thing.each do |ccu_unit|
|
thing.each do |ccu_unit|
|
||||||
@units << ccu_unit
|
@units << ccu_unit
|
||||||
end
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
@units << thing
|
@units << thing
|
||||||
end
|
end
|
||||||
|
|||||||
@ -135,6 +135,58 @@ EOF
|
|||||||
]
|
]
|
||||||
expect(run(<<EOF, "/abc/")).to eq expected
|
expect(run(<<EOF, "/abc/")).to eq expected
|
||||||
token pattern /\\/[^\\s]*\\//;
|
token pattern /\\/[^\\s]*\\//;
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
|
||||||
|
it "matches special character classes " do
|
||||||
|
expected = [
|
||||||
|
["a", "abc123_FOO"],
|
||||||
|
]
|
||||||
|
expect(run(<<EOF, "abc123_FOO")).to eq expected
|
||||||
|
token a /\\w+/;
|
||||||
|
EOF
|
||||||
|
expected = [
|
||||||
|
["b", "FROG*%$#"],
|
||||||
|
]
|
||||||
|
expect(run(<<EOF, "FROG*%$#")).to eq expected
|
||||||
|
token b /FROG\\D{1,4}/;
|
||||||
|
EOF
|
||||||
|
expected = [
|
||||||
|
["c", "$883366"],
|
||||||
|
]
|
||||||
|
expect(run(<<EOF, "$883366")).to eq expected
|
||||||
|
token c /$\\d+/;
|
||||||
|
EOF
|
||||||
|
expected = [
|
||||||
|
["d", "^&$@"],
|
||||||
|
]
|
||||||
|
expect(run(<<EOF, "^&$@")).to eq expected
|
||||||
|
token d /^\\W+/;
|
||||||
|
EOF
|
||||||
|
expected = [
|
||||||
|
["a", "abc123_FOO"],
|
||||||
|
[nil, " "],
|
||||||
|
["b", "FROG*%$#"],
|
||||||
|
[nil, " "],
|
||||||
|
["c", "$883366"],
|
||||||
|
[nil, " "],
|
||||||
|
["d", "^&$@"],
|
||||||
|
]
|
||||||
|
expect(run(<<EOF, "abc123_FOO FROG*%$# $883366 ^&$@")).to eq expected
|
||||||
|
token a /\\w+/;
|
||||||
|
token b /FROG\\D{1,4}/;
|
||||||
|
token c /$\\d+/;
|
||||||
|
token d /^\\W+/;
|
||||||
|
drop /\\s+/;
|
||||||
|
EOF
|
||||||
|
end
|
||||||
|
|
||||||
|
it "matches a negated character class with a nested inner negated character class" do
|
||||||
|
expected = [
|
||||||
|
["t", "$&*"],
|
||||||
|
]
|
||||||
|
expect(run(<<EOF, "$&*")).to eq expected
|
||||||
|
token t /[^%\\W]+/;
|
||||||
EOF
|
EOF
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -190,7 +190,7 @@ class Propane
|
|||||||
end
|
end
|
||||||
|
|
||||||
it "parses a negated character class with inner character classes" do
|
it "parses a negated character class with inner character classes" do
|
||||||
regex = Regex.new("[^x\\sz]")
|
regex = Regex.new("[^x\\sz]", 1)
|
||||||
expect(regex.unit).to be_a Regex::AlternatesUnit
|
expect(regex.unit).to be_a Regex::AlternatesUnit
|
||||||
expect(regex.unit.alternates.size).to eq 1
|
expect(regex.unit.alternates.size).to eq 1
|
||||||
expect(regex.unit.alternates[0]).to be_a Regex::SequenceUnit
|
expect(regex.unit.alternates[0]).to be_a Regex::SequenceUnit
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user