我需要验证这种格式的字符串:
H12345-001
这里的第一个字符应该是一个字母字符后跟5个数字,然后是短划线(-
),然后是两个零,最后是一个数字。
我不确定正则表达式是正确的选择,还是能够以天真的方式比较每个字符。如果正则表达式是正确的方法,有人可以指出一个示例教程来使用它。我正在使用C ++ 03(即没有C ++ 11)。
答案 0 :(得分:1)
假设你的字符串可以包含小写字母,正则表达式为[a-zA-z]\d\d\d\d\d-00\d
(如果你不想要小写字母,只需删除a-z
)。
简单的自定义验证器,如果引入正则表达式库是不值得的(demo):
bool isValid(const std::string& str)
{
return
(str.size() == 10) &&
(('a' <= str[0] && str[0] <= 'z') ||
('A' <= str[0] && str[0] <= 'Z')) &&
('0' <= str[1] && str[1] <= '9') &&
('0' <= str[2] && str[2] <= '9') &&
('0' <= str[3] && str[3] <= '9') &&
('0' <= str[4] && str[4] <= '9') &&
('0' <= str[5] && str[5] <= '9') &&
(str[6] == '-' && str[7] == '0' && str[8] == '0') &&
('0' <= str[9] && str[9] <= '9');
}
答案 1 :(得分:1)
您可以使用Boost.Regex:
#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/regex.hpp>
boost::regex your_regex("[A-Z]\\d{5}-00\\d");
boost::smatch match;
int main() {
std::string input = "H12345-001";
std::string output;
if(boost::regex_match(input, match, your_regex)) {
output = boost::lexical_cast<std::string>(match);
std::cout << output << std::endl;
}
return 0;
}
这是匹配单个事件的示例,您需要根据需要进行调整。
答案 2 :(得分:0)
任何正则表达式库都可以。例如,有POISX系统的pcre,只需#include <regex.h>
并调用regcomp
函数族(man 3 regcomp以获取更多信息)。这些都不需要C ++ 11。
坦率地说,如果你要使用正则表达式,对于这个问题似乎不值得,那么一个难题就是在C ++代码中使用正则表达式模式,因为必须逃避所有反斜杠和东西。您可能希望尝试使用this awesome solution here in SO来处理C ++中的正则表,并且没有太多问题。
否则,请按照Cornstalk的回答。
答案 3 :(得分:-1)
这个正则表达式非常糟糕,但最容易理解的是,我能想出的就是你想要的。
([A-Z])\d\d\d\d\d-00\d
这是一个关于它的教程,如所要求的: http://en.cppreference.com/w/cpp/regex