Skip to content

Commit ef906f0

Browse files
committed
Add regex_contains operator
1 parent 8f4647d commit ef906f0

5 files changed

Lines changed: 108 additions & 11 deletions

File tree

include/dracosha/validator/operators/regex.hpp

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,13 @@ struct regex_match_t : public op<regex_match_t>
3737
constexpr static const char* n_description="must not match expression";
3838

3939
template <typename T1, typename T2>
40-
constexpr bool operator() (const T1& a, const T2& b,
41-
std::enable_if_t<
42-
!std::is_same<T2,boost::regex>::value,
43-
void*
44-
> =nullptr) const
40+
constexpr bool operator() (const T1& a, const T2& b) const
4541
{
4642
return boost::regex_match(a,boost::regex(b));
4743
}
4844

4945
template <typename T1, typename T2>
50-
constexpr bool operator() (const T1& a, const T2& b,
51-
std::enable_if_t<
52-
std::is_same<T2,boost::regex>::value,
53-
void*
54-
> =nullptr) const
46+
constexpr bool operator() (const T1& a, const boost::regex& b) const
5547
{
5648
return boost::regex_match(a,b);
5749
}
@@ -82,6 +74,52 @@ struct regex_nmatch_t : public op<regex_nmatch_t>
8274
*/
8375
constexpr regex_nmatch_t regex_nmatch{};
8476

77+
/**
78+
* @brief Definition of operator "contains regular expression".
79+
*/
80+
struct regex_contains_t : public op<regex_contains_t>
81+
{
82+
constexpr static const char* description="must contain expression";
83+
constexpr static const char* n_description="must not contain expression";
84+
85+
template <typename T1, typename T2>
86+
constexpr bool operator() (const T1& a, const T2& b) const
87+
{
88+
return boost::regex_search(a,boost::regex(b));
89+
}
90+
91+
template <typename T1, typename T2>
92+
constexpr bool operator() (const T1& a, const boost::regex& b) const
93+
{
94+
return boost::regex_search(a,b);
95+
}
96+
};
97+
98+
/**
99+
@brief Operator "contains regular expression".
100+
*/
101+
constexpr regex_contains_t regex_contains{};
102+
103+
/**
104+
* @brief Definition of operator "not contain regular expression".
105+
*/
106+
struct regex_ncontains_t : public op<regex_ncontains_t>
107+
{
108+
constexpr static const char* description=regex_contains_t::n_description;
109+
constexpr static const char* n_description=regex_contains_t::description;
110+
111+
template <typename T1, typename T2>
112+
constexpr bool operator() (const T1& a, const T2& b) const
113+
{
114+
return !regex_contains(a,b);
115+
}
116+
};
117+
118+
/**
119+
@brief Operator "not contain regular expression".
120+
*/
121+
constexpr regex_ncontains_t regex_ncontains{};
122+
85123
/**
86124
* @brief Format boost::regex operand.
87125
*/

include/dracosha/validator/reporting/locale/ru.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,18 @@ inline const phrase_translator& validator_translator_ru()
326326
{"не должно соответствовать выражению",grammar_ru::sredny_rod},
327327
{"не должны соответствовать выражению",grammar_ru::mn_chislo}
328328
}; // "must not match expression"
329+
m[regex_contains.str()]={
330+
{"должен содержать выражению"},
331+
{"должна содержать выражению",grammar_ru::zhensky_rod},
332+
{"должно содержать выражению",grammar_ru::sredny_rod},
333+
{"должны содержать выражению",grammar_ru::mn_chislo}
334+
}; // "must contain expression"
335+
m[regex_contains.n_str()]={
336+
{"не должен содержать выражению"},
337+
{"не должна содержать выражению",grammar_ru::zhensky_rod},
338+
{"не должно содержать выражению",grammar_ru::sredny_rod},
339+
{"не должны содержать выражению",grammar_ru::mn_chislo}
340+
}; // "must not contain expression"
329341
m[str_alpha.str()]={
330342
{"должен содержать только буквы и цифры"},
331343
{"должна содержать только буквы и цифры",grammar_ru::zhensky_rod},

include/dracosha/validator/reporting/locale/sample_locale.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ inline const phrase_translator& validator_translator_sample()
177177
// regex and strings
178178
m[regex_match.str()]="must match expression"; // "must match expression"
179179
m[regex_match.n_str()]="must not match expression"; // "must not match expression"
180+
m[regex_contains.str()]="must contain expression"; // "must contain expression"
181+
m[regex_contains.n_str()]="must not contain expression"; // "must not contain expression"
180182
m[str_alpha.str()]="must contain only letters and digits"; // "must contain only letters and digits"
181183
m[str_alpha.n_str()]="must contain not only letters and digits"; // "must contain not only letters and digits"
182184
m[str_hex.str()]="must be a hexadecimal number"; // "must be a hexadecimal number"

test/testregex.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ using namespace DRACOSHA_VALIDATOR_NAMESPACE;
99

1010
BOOST_AUTO_TEST_SUITE(TestRegex)
1111

12-
BOOST_AUTO_TEST_CASE(CheckRegex)
12+
BOOST_AUTO_TEST_CASE(CheckRegexMatch)
1313
{
1414
std::string rep;
1515

@@ -34,6 +34,49 @@ BOOST_AUTO_TEST_CASE(CheckRegex)
3434
BOOST_CHECK(!v2.apply(ra2));
3535
BOOST_CHECK_EQUAL(rep,"must match expression [0-9a-zA-Z_]+");
3636
rep.clear();
37+
38+
auto v3=validator(
39+
regex_nmatch,boost::regex("[0-9a-zA-Z_]+")
40+
);
41+
BOOST_CHECK(!v3.apply(ra1));
42+
BOOST_CHECK_EQUAL(rep,"must not match expression [0-9a-zA-Z_]+");
43+
rep.clear();
44+
BOOST_CHECK(v3.apply(ra2));
45+
}
46+
47+
BOOST_AUTO_TEST_CASE(CheckRegexContains)
48+
{
49+
std::string rep;
50+
51+
auto v1=validator(
52+
regex_contains,"[0-9][0-9][0-9]"
53+
);
54+
std::string str1="abcAnz120";
55+
auto ra1=make_reporting_adapter(str1,rep);
56+
BOOST_CHECK(v1.apply(ra1));
57+
58+
auto v2=validator(
59+
regex_contains,boost::regex("[0-9][0-9][0-9]")
60+
);
61+
BOOST_CHECK(v2.apply(ra1));
62+
63+
std::string str2="Hello world 12 34";
64+
auto ra2=make_reporting_adapter(str2,rep);
65+
BOOST_CHECK(!v1.apply(ra2));
66+
BOOST_CHECK_EQUAL(rep,"must contain expression [0-9][0-9][0-9]");
67+
rep.clear();
68+
69+
BOOST_CHECK(!v2.apply(ra2));
70+
BOOST_CHECK_EQUAL(rep,"must contain expression [0-9][0-9][0-9]");
71+
rep.clear();
72+
73+
auto v3=validator(
74+
regex_ncontains,"[0-9][0-9][0-9]"
75+
);
76+
BOOST_CHECK(!v3.apply(ra1));
77+
BOOST_CHECK_EQUAL(rep,"must not contain expression [0-9][0-9][0-9]");
78+
rep.clear();
79+
BOOST_CHECK(v3.apply(ra2));
3780
}
3881

3982
BOOST_AUTO_TEST_CASE(CheckAlpha)

test/testtranslator.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,8 @@ BOOST_AUTO_TEST_CASE(CheckSampleLocale)
350350
// regex and strings
351351
BOOST_CHECK_EQUAL(m(regex_match.str()).text(),regex_match.str());
352352
BOOST_CHECK_EQUAL(m(regex_match.n_str()).text(),regex_match.n_str());
353+
BOOST_CHECK_EQUAL(m(regex_contains.str()).text(),regex_contains.str());
354+
BOOST_CHECK_EQUAL(m(regex_contains.n_str()).text(),regex_contains.n_str());
353355
BOOST_CHECK_EQUAL(m(str_alpha.str()).text(),str_alpha.str());
354356
BOOST_CHECK_EQUAL(m(str_alpha.n_str()).text(),str_alpha.n_str());
355357
BOOST_CHECK_EQUAL(m(str_hex.str()).text(),str_hex.str());

0 commit comments

Comments
 (0)