summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-09-26 23:51:05 +0900
committerMaxime Coste <mawww@kakoune.org>2017-11-01 14:05:14 +0800
commit2f450e0080edc269a129f309cd66b5662378fa66 (patch)
treeacbe3ed6fc41ae6d502671a89d54b75173439376 /src
parent7a313ddafe74637d85e677b9b319cf6e6b99c6b1 (diff)
Regex: Add support for \Q...\E quoted parts
Diffstat (limited to 'src')
-rw-r--r--src/regex_impl.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/regex_impl.cc b/src/regex_impl.cc
index 948cd50a..933af2ad 100644
--- a/src/regex_impl.cc
+++ b/src/regex_impl.cc
@@ -200,6 +200,19 @@ private:
{
const Codepoint cp = *m_pos++;
+ if (cp == 'Q')
+ {
+ auto escaped_sequence = new_node(ParsedRegex::Sequence);
+ constexpr StringView end_mark{"\\E"};
+ auto quote_end = std::search(m_pos.base(), m_regex.end(), end_mark.begin(), end_mark.end());
+ while (m_pos != quote_end)
+ escaped_sequence->children.push_back(new_node(ParsedRegex::Literal, *m_pos++));
+ if (quote_end != m_regex.end())
+ m_pos += 2;
+
+ return escaped_sequence;
+ }
+
// CharacterClassEscape
for (auto& character_class : character_class_escapes)
{
@@ -962,6 +975,17 @@ auto test_regex = UnitTest{[]{
kak_assert(vm.exec("123-456"));
kak_assert(not vm.exec("123_456"));
}
+
+ {
+ TestVM vm{R"(\Q{}[]*+?\Ea+)"};
+ kak_assert(vm.exec("{}[]*+?aa"));
+ }
+
+ {
+ TestVM vm{R"(\Q...)"};
+ kak_assert(vm.exec("..."));
+ kak_assert(not vm.exec("bla"));
+ }
}};
}