summaryrefslogtreecommitdiff
path: root/src/regex_impl.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-09-27 00:01:06 +0900
committerMaxime Coste <mawww@kakoune.org>2017-11-01 14:05:14 +0800
commit4ac0d35d1e00dec9461d3ecfa2057cfda1dab31e (patch)
treef15591c208fa03b47192be8f36f2d1a4f560f993 /src/regex_impl.cc
parent2f450e0080edc269a129f309cd66b5662378fa66 (diff)
Regex: Add support for `\K` that reset the start capture
Diffstat (limited to 'src/regex_impl.cc')
-rw-r--r--src/regex_impl.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/regex_impl.cc b/src/regex_impl.cc
index 933af2ad..d3ca59d9 100644
--- a/src/regex_impl.cc
+++ b/src/regex_impl.cc
@@ -28,6 +28,7 @@ struct ParsedRegex
NotWordBoundary,
SubjectBegin,
SubjectEnd,
+ ResetStart,
};
struct Quantifier
@@ -154,6 +155,7 @@ private:
case 'B': m_pos += 2; return new_node(ParsedRegex::NotWordBoundary);
case '`': m_pos += 2; return new_node(ParsedRegex::SubjectBegin);
case '\'': m_pos += 2; return new_node(ParsedRegex::SubjectEnd);
+ case 'K': m_pos += 2; return new_node(ParsedRegex::ResetStart);
}
break;
/* TODO: look ahead, look behind */
@@ -514,6 +516,10 @@ private:
case ParsedRegex::SubjectEnd:
push_op(CompiledRegex::SubjectEnd);
break;
+ case ParsedRegex::ResetStart:
+ push_op(CompiledRegex::Save);
+ push_byte(0);
+ break;
}
for (auto& offset : goto_inner_end_offsets)
@@ -986,6 +992,13 @@ auto test_regex = UnitTest{[]{
kak_assert(vm.exec("..."));
kak_assert(not vm.exec("bla"));
}
+
+ {
+ TestVM vm{R"(foo\Kbar)"};
+ kak_assert(vm.exec("foobar", true, true));
+ kak_assert(StringView{vm.m_captures[0], vm.m_captures[1]} == "bar");
+ kak_assert(not vm.exec("bar", true, true));
+ }
}};
}