C++学习 | 通过正则表达式保证输入格式的正确性

——仅记录个人学习过程——

如果题目中提出了“读入特定输入格式的数据,如果不符合要求则抛出异常、输出错误提示、结束程序”的要求,使用C++的普通输入流无法解决。我使用的方法是逐行读入、结合正则表达式。

题目要求:

  • 从input.txt文件中读入以下内容
  • 首先输入一个正整数n,表示接下来输入的数据总行数。
  • 输入n行数据,每行形如"C 0 1 3"或“L 2 3 5 3”或“S 3 6 4 1”(字符‘C‘后跟三个整数,或字符‘L‘、‘S‘后跟四个整数),如果输入格式不对,或是输入行数过多或过少,则抛出相应异常。
#include <fstream>
#include <sstream>
#include <string>
#include <regex>

const regex Nregex("\\s*(0|([1-9][0-9]*))\\s*"); //首行的n
const regex ENDregex("\\s*"); //文件末尾的空白
const regex THREEregex("(\\s+-?(0|([1-9][0-9]*))){3}\\s*"); //三个整数
const regex FOURregex("(\\s+-?(0|([1-9][0-9]*))){4}\\s*"); //四个整数

ifstream input;
input.open("input.txt", ios::in);
int n;
stringstream inputLineStream;
string nString;

getline(input, nString);
if (!regex_match(nString, Nregex)) {
    //未匹配到文件开始的n,此处的处理操作省略
}
n = stoi(nString); //字符串转整数
for (int i = 0; i < n; i++) {
    inputLineStream.clear();
    string newInputLine;
    string kind;
    input >> kind;
    if (!kind.compare("L") || !kind.compare("S")) {
        getline(input, newInputLine);
        if (!regex_match(newInputLine, FOURregex)) {
            //输入不是四个整数,此处的处理操作省略
        }
        inputLineStream << newInputLine;
        inputLineStream >> int1 >> int2 >> int3 >> int4; //具体处理省略,从这个stream中可以读出这四个整数
    }
    else if (!kind.compare("C")) {
        getline(input, newInputLine);
        if (!regex_match(newInputLine, THREEregex)) {
            //输入不是三个整数,此处的处理操作省略
        }
        inputLineStream << newInputLine;
        inputLineStream >> int1 >> int2 >> int3; //具体处理省略,从这个stream中可以读出这四个整数
    }
    else {
        //读入的并非"C"、"L"、"S",格式显然错误
    }
}
string testEndString;
getline(input, testEndString);
if (!regex_match(testEndString, ENDregex)) {
    //输入未结束,此处的处理操作省略
}
input.close();

原文地址:https://www.cnblogs.com/QiTang/p/12582247.html

时间: 2024-08-03 19:22:41

C++学习 | 通过正则表达式保证输入格式的正确性的相关文章

js正则表达式:验证邮箱格式、密码复杂度、手机号码、QQ号码

直接上代码 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83

MapReduce输入格式

文件是 MapReduce 任务数据的初始存储地.正常情况下,输入文件一般是存储在 HDFS 里面.这些文件的格式可以是任意的:我们可以使用基于行的日志文件, 也可以使用二进制格式,多行输入记录或者其它一些格式.这些文件一般会很大,达到数十GB,甚至更大.那么 MapReduce 是如何读取这些数据的呢?下面我们来学习 InputFormat 接口 1.InputFormat接口 InputFormat接口决定了输入文件如何被 Hadoop分块(split up)与接受.InputFormat

有五个学生,每个学生有3门课(语文、数学、英语)的成绩, * 写一个程序接收从键盘输入学生的信息,输入格式为:name,30,30,30(姓名,三门课成绩)

/* * 3. 有五个学生,每个学生有3门课(语文.数学.英语)的成绩, * 写一个程序接收从键盘输入学生的信息,输入格式为:name,30,30,30(姓名,三门课成绩), * 然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中. * 要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息 * */ import java.io.*; import java.util.*; public class Test3 { publi

PHP学习之-正则表达式

PHP学习之-正则表达式 1.什么是正则表达式 正则表达式是对字符串处理额一种逻辑公式,就是用特定的字符串组合成一个规则的字符串,称之为正则匹配模式 $p = '/apple/'; $str = ''apple banna'; if (preg_match($p,$str)) { echo 'matched'; } 其中字符串 '/apple/' 就是一个正则表达式,用来匹配字符串中是否存在apple字符串. PHP中使用PCRE库函数进行正则匹配,比如上例中的preg_match用于执行一个正

Linux学习之正则表达式&grep&egrep

我们经常需要在文档中搜索符合自己要求的内容,这些部分可能分散在文档的各个位置,各个角落.可以利用关键字例如/keyword或者?keyword一个一个的搜索,还有我可能不止想搜索关键字,而是指定一个范围,怎样操作?而且怎样把这些搜索到的内容集中地显示出来?使用正则表达式搜索字串的grep命令和egrep命令就可以满足我们的这个要求. 正则表达式(Regular Expression)是一种字符书写的模式,以行为单位进行字符的处理,透过一些特殊字符的辅助,利用这种模式可以轻易地达到对字符的搜索.删

Js使用正则表达式判断邮箱格式

1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 4 <title>验证Email是否正确</title> 5 <script language="javascript"> 6 function checkemail(str){ 7 //在Jav

.net学习之正则表达式(Regular Expression)

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. c#中这些给定的字符叫做元字符,下面是所有元字符的一张表,这些东西不需要刻意去记它,用的多了就自然熟练了. 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 后向引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而

PERL学习笔记---正则表达式的应用

使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者m,fred,, m!fred!, m^fred^,其它非成对的分隔符也可以 不区分大小写:/i if(/yes/i) {#大小写无关 print “In that case, I recommend that you go bowling.\n”;} 匹配任何字符:/s 默认情况下,点(.)不匹配换行符,这

4.C#学习之正则表达式&amp;&amp;Regex

正则表达式(Regular expressions)是一套语法匹配规则,各种语言,如Perl, .Net和Java都有其 对应的共享的正则表达式类库.在.Net中,这个类库叫做Regex. 以下是Regex下的几个静态方法: Escape: 对字符串中的regex中的转义符进行转义:       IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值:       Match: 返回Match的实例:       Matches: 返回一系列的Match的方法:       Repla