1 #include <ctre.hpp>
2 #include <string_view>
3 
empty_symbol()4 void empty_symbol() { }
5 
6 #if !CTRE_CNTTP_COMPILER_CHECK
7 #define CTRE_CREATE(pattern) (pattern ## _ctre)
8 #define CTRE_SYNTAX(pattern) (pattern ## _ctre_syntax)
9 #else
10 
create()11 template <ctll::fixed_string input> constexpr auto create() {
12 	constexpr auto _input = input;
13 
14 	using tmp = typename ctll::parser<ctre::pcre, _input, ctre::pcre_actions>::template output<ctre::pcre_context<>>;
15 	static_assert(tmp(), "Regular Expression contains syntax error.");
16 	using re = decltype(front(typename tmp::output_type::stack_type()));
17 	return ctre::regular_expression(re());
18 }
19 
syntax()20 template <ctll::fixed_string input> constexpr bool syntax() {
21 	constexpr auto _input = input;
22 
23 	return ctll::parser<ctre::pcre, _input, ctre::pcre_actions>::template correct_with<ctre::pcre_context<>>;
24 }
25 
26 
27 #define CTRE_CREATE(pattern) create<pattern>()
28 #define CTRE_SYNTAX(pattern) syntax<pattern>()
29 
30 #endif
31 
32 using namespace ctre::literals;
33 using namespace ctre::test_literals;
34 using namespace std::string_view_literals;
35 
36 static_assert(CTRE_CREATE("").search("abc"sv));
37 static_assert(CTRE_CREATE("abc").match("abc"sv));
38 
39 static_assert(CTRE_CREATE("a").match("a"sv));
40 static_assert(CTRE_CREATE("a").search("abc"sv));
41 static_assert(CTRE_CREATE("b").search("abc"sv));
42 static_assert(!CTRE_CREATE("^b").match("abc"sv));
43 static_assert(!CTRE_CREATE("b").match("a"sv));
44 static_assert(CTRE_CREATE(".").match("a"sv));
45 static_assert(CTRE_CREATE(".").search("abc"sv));
46 static_assert(CTRE_CREATE("[\\-]").match("-"sv));
47 static_assert(CTRE_CREATE("[\\\\]").match("\\"sv));
48 static_assert(CTRE_CREATE("[a-z]").match("a"sv));
49 static_assert(CTRE_CREATE("[a-z]").match("f"sv));
50 static_assert(CTRE_CREATE("[a-z]").match("z"sv));
51 static_assert(!CTRE_CREATE("[a-z]").match("Z"sv));
52 static_assert(CTRE_CREATE("\\u0050").match("P"sv));
53 static_assert(CTRE_CREATE("[\\u0050-\\u0051]").match("Q"sv));
54 static_assert(CTRE_CREATE("\u0050").match("P"sv)); // be aware!
55 
56 static_assert(CTRE_CREATE("^[\\x30-\\x39]+?$").match("123456789"sv));
57 static_assert(CTRE_CREATE("[a-z0-9]").match("0"sv));
58 static_assert(!CTRE_CREATE("[a-z0-9]").match("A"sv));
59 static_assert(CTRE_CREATE("[[:xdigit:]]").match("0"sv));
60 static_assert(CTRE_CREATE("[[:xdigit:]]").match("9"sv));
61 static_assert(CTRE_CREATE("[[:xdigit:]]").match("a"sv));
62 static_assert(CTRE_CREATE("[[:xdigit:]]").match("A"sv));
63 static_assert(CTRE_CREATE("[[:xdigit:]]").match("f"sv));
64 static_assert(!CTRE_CREATE("[[:xdigit:]]").match("g"sv));
65 static_assert(CTRE_CREATE("abcdef").match("abcdef"sv));
66 static_assert(!CTRE_CREATE("abcdef").match("abcGef"sv));
67 static_assert(CTRE_CREATE("").match(""sv));
68 static_assert(CTRE_CREATE("(?:a|b|c)").match("a"sv));
69 static_assert(CTRE_CREATE("(?:a|b|c)").match("b"sv));
70 static_assert(CTRE_CREATE("(?:a|b|c)").match("c"sv));
71 static_assert(!CTRE_CREATE("(?:a|b|c)").match("d"sv));
72 static_assert(CTRE_CREATE("(?:xy)?").match("xy"sv));
73 static_assert(CTRE_CREATE("(?:xy)?").match(""sv));
74 static_assert(CTRE_CREATE("(?:xy)?").search("zxy"sv));
75 static_assert(CTRE_CREATE("(?:xy)?$").search("zxy"sv));
76 static_assert(!CTRE_CREATE("~(?:xy)?$").match("zxy"sv));
77 
78 static_assert(CTRE_CREATE("^abc").match("abc"sv));
79 static_assert(CTRE_CREATE("^def$").match("def"sv));
80 static_assert(!CTRE_CREATE("a^").match("a"sv));
81 static_assert(!CTRE_CREATE("$a").match("a"sv));
82 
83 static_assert(CTRE_CREATE("a+?").search("aaax"sv));
84 static_assert(CTRE_CREATE("a+?").search("ax"sv));
85 static_assert(!CTRE_CREATE("a+?").match("x"sv));
86 
87 static_assert(CTRE_CREATE("a++").search("aaax"sv));
88 static_assert(CTRE_CREATE("a++").search("ax"sv));
89 static_assert(!CTRE_CREATE("a++").match("x"sv));
90 
91 static_assert(CTRE_CREATE("a*?x").match("aaax"sv));
92 static_assert(CTRE_CREATE("a*?x").match("ax"sv));
93 static_assert(CTRE_CREATE("a*?x").match("x"sv));
94 static_assert(!CTRE_CREATE("a*?x").match("y"sv));
95 
96 static_assert(CTRE_CREATE("a*+x").match("aaax"sv));
97 static_assert(CTRE_CREATE("a*+x").match("ax"sv));
98 static_assert(CTRE_CREATE("a*+x").match("x"sv));
99 static_assert(!CTRE_CREATE("a*+x").match("y"sv));
100 
101 static_assert(!CTRE_CREATE("a*+ab").match("aaab"sv));
102 static_assert(!CTRE_CREATE("a++ab").match("aaab"sv));
103 static_assert(!CTRE_CREATE("a*+ab").match("ab"sv));
104 static_assert(!CTRE_CREATE("a++ab").match("aab"sv));
105 
106 static_assert(CTRE_CREATE("a*+ba").match("aaba"sv));
107 static_assert(CTRE_CREATE("a++ba").match("aaba"sv));
108 static_assert(CTRE_CREATE("a*+ba").match("ba"sv));
109 static_assert(CTRE_CREATE("a++ba").match("aba"sv));
110 
111 static_assert(CTRE_CREATE("a{3,}x").match("aaax"sv));
112 static_assert(CTRE_CREATE("a{3,}x").match("aaaax"sv));
113 
114 static_assert(CTRE_CREATE("^a{5}").match("aaaaa"sv));
115 static_assert(CTRE_CREATE("^a{5}").search("aaaaaa"sv));
116 static_assert(!CTRE_CREATE("^a{5}$").match("aaaaaa"sv));
117 
118 static_assert(CTRE_CREATE("a*").match("aaa"sv));
119 static_assert(CTRE_CREATE("a+").match("aaa"sv));
120 static_assert(CTRE_CREATE("a*").match(""sv));
121 static_assert(CTRE_CREATE("a+").match("a"sv));
122 
123 static_assert(CTRE_CREATE("a*$").match("aaa"sv));
124 static_assert(CTRE_CREATE("a+$").match("aaa"sv));
125 static_assert(CTRE_CREATE("a*$").match(""sv));
126 static_assert(CTRE_CREATE("a+$").match("a"sv));
127 
128 static_assert(CTRE_CREATE("a*xb").match("aaxb"sv));
129 static_assert(CTRE_CREATE("a+xb").match("aaxb"sv));
130 static_assert(CTRE_CREATE("a*xb").match("xb"sv));
131 static_assert(CTRE_CREATE("a+xb").match("axb"sv));
132 
133 static_assert(CTRE_CREATE("a*ab").match("aaab"sv));
134 static_assert(CTRE_CREATE("a+ab").match("aaab"sv));
135 static_assert(CTRE_CREATE("a*ab").match("ab"sv));
136 static_assert(CTRE_CREATE("a+ab").match("aab"sv));
137 
138 static_assert(!CTRE_CREATE("^a{2,5}ab").match("aab"sv));
139 static_assert(CTRE_CREATE("^a{2,5}ab").match("aaab"sv));
140 static_assert(CTRE_CREATE("^a{2,5}ab").match("aaaab"sv));
141 static_assert(CTRE_CREATE("^a{2,5}ab").match("aaaaab"sv));
142 static_assert(CTRE_CREATE("^a{2,5}ab").match("aaaaaab"sv));
143 static_assert(!CTRE_CREATE("^a{2,5}ab").match("aaaaaaab"sv));
144 
145 static_assert(CTRE_CREATE("[a-z]+[^a-z]+").match("abcdef123456"sv));
146 
147 static_assert(CTRE_CREATE("(abc)").match("abc"sv));
148 static_assert(CTRE_CREATE("(abc)+").match("abc"sv));
149 static_assert(CTRE_CREATE("(abc)+").match("abcabc"sv));
150 static_assert(CTRE_CREATE("(abc)+").match("abcabcabc"sv));
151 
152 static_assert(CTRE_CREATE("(?<name>abc)").match("abc"sv));
153 static_assert(CTRE_CREATE("(?<name>abc)+").match("abc"sv));
154 static_assert(CTRE_CREATE("(?<name>abc)+").match("abcabc"sv));
155 static_assert(CTRE_CREATE("(?<name>abc)+").match("abcabcabc"sv));
156 static_assert(!CTRE_CREATE("(?<name>abc)+").match("name"sv));
157 
158 static_assert(std::string_view{CTRE_CREATE("^([a-z]+)").search("abcdef1234"sv)} == "abcdef"sv);
159 static_assert(std::string_view{CTRE_CREATE("^([a-z]+)1234").match("abcdef1234"sv)} == "abcdef1234"sv);
160 static_assert(std::string_view{CTRE_CREATE("^([a-z])").search("abcdef1234"sv)} == "a"sv);
161 
162 static_assert(CTRE_CREATE("^([0-9]+[a-z]+)+").match("123abc456def"sv));
163 static_assert(CTRE_CREATE("^([0-9]+[a-z]+)+").match("123abc456def"sv).template get<1>() == "456def"sv);
164 static_assert(CTRE_CREATE("^([0-9]+[a-z]+)+").match("123abc456def"sv).template get<0>() == "123abc456def"sv);
165 
166 static_assert(CTRE_CREATE("^([0-9]++[a-z]++)+").match("123abc456def"sv));
167 static_assert(CTRE_CREATE("^([0-9]++[a-z]++)+").match("123abc456def"sv).template get<1>() == "456def"sv);
168 static_assert(CTRE_CREATE("^([0-9]++[a-z]++)+").match("123abc456def"sv).template get<0>() == "123abc456def"sv);
169 
170 static_assert(CTRE_CREATE("^([0-9]+?[a-z]+?)+").search("123abc456def"sv));
171 static_assert(CTRE_CREATE("^([0-9]+?[a-z]+?)+").search("123abc456def"sv).template get<1>() == "123a"sv);
172 static_assert(CTRE_CREATE("^([0-9]+?[a-z]+?)+").search("123abc456def"sv).template get<0>() == "123a"sv);
173 
174 static_assert(CTRE_CREATE("^([0-9]+?[a-z]++)+").match("123abc456def"sv));
175 static_assert(CTRE_CREATE("^([0-9]+?[a-z]++)+").match("123abc456def"sv).template get<1>() == "456def"sv);
176 static_assert(CTRE_CREATE("^([0-9]+?[a-z]++)+").match("123abc456def"sv).template get<0>() == "123abc456def"sv);
177 
178 static_assert(CTRE_CREATE("^([a-z]{2})([a-z]{2})").match("abcd"sv).template get<2>() == "cd"sv);
179 // FIXME  ID support
180 //static_assert(CTRE_CREATE("^([a-z]{2})(?<second>[a-z]{2})").match("abcd"sv).template get<decltype("second")_id)>() == "cd"sv);
181 
182 static_assert(CTRE_CREATE("^([a-z]+):\\g{1}$").match("abc:abc"sv));
183 static_assert(CTRE_CREATE("^([a-z]+):\\g{1}$").match("abc:abc"sv).template get<1>() == "abc"sv);
184 static_assert(!CTRE_CREATE("^([a-z]+):\\g{1}$").match("abc:abce"sv));
185 static_assert(CTRE_CREATE("^([a-z]+)\\g{1}$").match("abcabc"sv));
186 static_assert(!CTRE_CREATE("^([a-z]+)\\g{1}$").match("abcabcd"sv));
187 static_assert(CTRE_SYNTAX("^([a-z]+)\\g{-1}$"));
188 static_assert(CTRE_CREATE("^([a-z]+)\\g{-1}$").match("abcabc"sv));
189 static_assert(!CTRE_SYNTAX("^([a-z]+)\\g{-2}$"));
190 // TODO check for existence of named capture too
191 
192 static_assert(CTRE_CREATE("^(?<text>[a-z]+):\\g{text}$").match("abc:abc"sv));
193 
194 static_assert(CTRE_CREATE("^abc$").match("abc"sv));
195 static_assert(CTRE_CREATE("^abc$").match(L"abc"sv));
196 // static_assert(CTRE_CREATE("^abc$").match(u8"abc"sv)); // GCC9.0.1 doesn't support a char8_t string_view literals
197 static_assert(CTRE_CREATE("^abc$").match(u"abc"sv));
198 static_assert(CTRE_CREATE("^abc$").match(U"abc"sv));
199 
200 static_assert(CTRE_CREATE(R"(\(\))").match("()"sv));
201 static_assert(CTRE_CREATE("\\[\\]").match("[]"sv));
202 static_assert(CTRE_CREATE(R"(\[\])").match("[]"sv));
203 
204 static_assert(CTRE_CREATE(R"(\[([A-Z]*?)\])").match("[]"sv));
205 static_assert(CTRE_CREATE(R"(\[([A-Z]*?)\])").match("[URL]"sv));
206 
207 static_assert(CTRE_CREATE(R"(\[([\s\S]*?)\]\(([\s\S]*?)\))").match("[URL](https://cpp.fail/ctre)"));
208 
209 static_assert(CTRE_CREATE("\\s").match(" "));
210 static_assert(CTRE_CREATE("[[:space:]]").match(" "));
211 static_assert(CTRE_CREATE("\\h").match(" "));
212 static_assert(CTRE_CREATE("\\h").match(L"\x2009"));
213 static_assert(CTRE_CREATE("\\v").match("\n"));
214 
215 static_assert(CTRE_CREATE("\\S").match("A"));
216 static_assert(CTRE_CREATE("\\H").match("A"));
217 static_assert(CTRE_CREATE("\\V").match("A"));
218 
219 
220 static_assert(CTRE_CREATE("abc").match("abc"));
221 static_assert(CTRE_CREATE("[_]").match("_"));
222 static_assert(CTRE_CREATE("[()]").match("("));
223 static_assert(CTRE_CREATE("[$]").match("$"));
224 static_assert(CTRE_CREATE("[*]").match("*"));
225 static_assert(CTRE_CREATE("[+]").match("+"));
226 static_assert(CTRE_CREATE("[?]").match("?"));
227 static_assert(CTRE_CREATE("[{}]").match("{"));
228 static_assert(CTRE_CREATE("[(-)]").match("("));
229 static_assert(CTRE_CREATE("[(-)]").match(")"));
230 
231 static_assert(CTRE_CREATE("[A-Z_a-z]").match("a"));
232 static_assert(CTRE_CREATE("[A-Z_a-z]").match("_"));
233 static_assert(CTRE_CREATE("[A-Z_a-z]").match("Z"));
234 // static_assert(CTRE_CREATE("[-]").match("-"));
235 // static_assert(CTRE_CREATE("[-x]").match("x"));
236 // FIXME: due current limitation of LL1 grammar parser I can make this work "[x-]" without significant change in grammar
237 static_assert(CTRE_CREATE("<").match("<"));
238 static_assert(CTRE_CREATE("(<)").match("<"));
239 static_assert(CTRE_CREATE("(<>)").match("<>"));
240 static_assert(CTRE_CREATE("(<>?)").match("<"));
241 static_assert(CTRE_CREATE("(<?>)").match(">"));
242 static_assert(CTRE_CREATE("()").match(""));
243 
244 
245 static_assert((CTRE_CREATE("[a-z]") >> CTRE_CREATE("[0-9]")).match("a9"));
246 static_assert((CTRE_CREATE("a") | CTRE_CREATE("b")).match("a"));
247 static_assert((CTRE_CREATE("a") | CTRE_CREATE("b")).match("b"));
248 static_assert(!(CTRE_CREATE("a") | CTRE_CREATE("b")).match("c"));
249 
250 static_assert(CTRE_CREATE("((a)(b))").match("ab"sv).template get<0>() == "ab"sv);
251 static_assert(CTRE_CREATE("((a)(b))").match("ab"sv).template get<1>() == "ab"sv);
252 static_assert(CTRE_CREATE("((a)(b))").match("ab"sv).template get<2>() == "a"sv);
253 static_assert(CTRE_CREATE("((a)(b))").match("ab"sv).template get<3>() == "b"sv);
254 
255 static_assert(CTRE_CREATE("^x(?=y)").search("xy"sv).template get<0>() == "x"sv);
256 static_assert(CTRE_CREATE("^x(?!a)").search("xy"sv).template get<0>() == "x"sv);
257 
258 static_assert(CTRE_CREATE("a(?!3)[0-9]").match("a0"sv));
259 static_assert(CTRE_CREATE("a(?!3)[0-9]").match("a9"sv));
260 static_assert(!CTRE_CREATE("a(?!3)[0-9]").match("a3"sv));
261 
262 static_assert(!CTRE_CREATE(".*(.)\\g{1}.*").match("abcdefghijk"sv));
263 static_assert(CTRE_CREATE(".*(.)\\g{1}.*").match("aabcdefghijk"sv));
264 static_assert(CTRE_CREATE(".*(.)\\g{1}.*").match("abcdeffghijk"sv));
265 
266 static_assert(CTRE_CREATE("(?=.*(.)\\g{1})[a-z]+").match("abcdeffghijk"sv));
267 static_assert(!CTRE_CREATE("(?=.*(.)\\g{1}{2})[a-z]+").match("abcddeffghijk"sv));
268 static_assert(CTRE_CREATE("(?=.*(.)\\g{1}{2})[a-z]+").match("abcdddeffghijk"sv));
269 
270 static_assert( CTRE_CREATE("(?!.*(.)\\g{1})[a-z]+").match("abcdefgh"sv));
271 static_assert(!CTRE_CREATE("(?!.*(.)\\g{1})[a-z]+").match("abcdeefgh"sv));
272 
273 static_assert(CTRE_CREATE("_").match("_"sv));
274 static_assert(CTRE_CREATE("[<]").match("<"sv));
275 static_assert(CTRE_CREATE("[>]").match(">"sv));
276 static_assert(CTRE_CREATE("[<>]").match("<"sv));
277 static_assert(CTRE_CREATE("[<>]+").match("><"sv));
278 
279 static_assert(CTRE_CREATE("<[a-z]+>").match("<aloha>"sv));
280 static_assert(CTRE_CREATE("(<[a-z]+>)\\g{1}").match("<aloha><aloha>"sv));
281 
282 // issue #60
283 static_assert(CTRE_CREATE("[^\\^]").match("a"sv));
284 static_assert(CTRE_CREATE("[^^]").match("a"sv));
285 static_assert(CTRE_CREATE("[\\-]").match("-"sv));
286 //static_assert(CTRE_CREATE("[-]").match("-"sv));
287 static_assert(CTRE_CREATE("[\\--\\-]").match("-"sv));
288 
289 // issue #131
290 static_assert(CTRE_CREATE("(|a)+").match("aaaaaa"sv));
291