基本上,我希望能够有一个正则表达式,例如#[0-9] +并能够检查字符串是否可以匹配它。例如,如果我得到用户输入并且他们输入“#”,则此字符串与正则表达式不匹配,但是如果用户也输入了一些数字,则可能是该字符串。
我知道C ++具有matchs()函数,但是有什么我想要的东西吗?或采取某种方式?
谢谢
免责声明:以下是一种非常幼稚的方法,既不快捷也不美观。然而,它可以完成简单的正则表达式。我不建议您在不了解其用途的情况下使用它
#include <string>
#include <iostream>
#include <regex>
bool is_valid_regex_string(const std::string& rgx_str)
{
bool bResult = true;
try
{
std::regex tmp(rgx_str);
}
catch (const std::regex_error& e)
{
(e);
bResult = false;
}
return bResult;
}
std::string create_partial_regex_string(const std::string& rgx_str)
{
std::string par_rgx_str;
for (int i = 1; i <= rgx_str.size(); i++)
{
std::string sub_rgx_str = rgx_str.substr(0, i);
if (is_valid_regex_string(sub_rgx_str))
{
if (!par_rgx_str.empty())par_rgx_str += "|";
par_rgx_str += "(" + sub_rgx_str + ")";
}
}
//return par_rgx_str;
return "^" + par_rgx_str + "$";
}
void testPartialRegex(const std::string& rgx, const std::string& str)
{
std::string partialRegexString = create_partial_regex_string(rgx);
std::regex partRegex(partialRegexString);
std::cout << "\tTESTING \"" << str << "\" against \"" << partialRegexString << "\" :" << std::endl;
std::smatch base_match;
std::cout << "\t\t-> " << (std::regex_match(str, partRegex) ? "true" : "false") << std::endl;
}
void test(const std::string& str)
{
std::cout << "\n###########################################\nTESTING \"" << str << "\"\n" << std::endl;
for (int i = 1; i <= str.size(); i++)
{
testPartialRegex("#[0-9]+", str.substr(0, i));
}
std::cout << "\n###########################################\n" << std::endl;
}
int main()
{
test("#123456");
test("#12a3456");
test("#b");
test("123456");
test("##");
return 0;
}
输出:
###########################################
TESTING "#123456"
TESTING "#" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#1" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#12" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#123" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#1234" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#12345" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#123456" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
###########################################
###########################################
TESTING "#12a3456"
TESTING "#" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#1" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#12" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#12a" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "#12a3" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "#12a34" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "#12a345" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "#12a3456" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
###########################################
###########################################
TESTING "#b"
TESTING "#" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "#b" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
###########################################
###########################################
TESTING "123456"
TESTING "1" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "12" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "123" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "1234" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "12345" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
TESTING "123456" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
###########################################
###########################################
TESTING "##"
TESTING "#" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> true
TESTING "##" against "^(#)|(#[0-9])|(#[0-9]+)$" :
-> false
###########################################
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句