在软件构造lab3中,要求实现一个VoteType类,它的作用是记录一次投票活动中,不同的投票选项以及该投票选项所代表的分值。
该类的构造函数的一种直观想法就是,向其传入一个map,其key值代表投票项,value代表该投票项代表的分值,这样就构造出了一个VoteType对象,并且由于传入信息时,map的key和value已经对输入的类型,格式作了限制,所以实现起来比较直观,简单。
但此处的构造函数也可以使用正则表达式来进行构造,可以考虑使用输入一个特定格式的字符串,使用一个正则表达式对其进行匹配,从中提取出有用的信息,来获得不同的投票选项以及该投票选项所代表的分值。
其要求如下:“喜欢”(2)|“不喜欢”(-1)|“无所谓”(1)
其中,用双引号括起来的文字部分是一个投票选项,长度不超过 5,其中不允许出现空格;用括号括起来的数字是投票选项对应的分数,可以是正整数、0或负整数,不能带小数,正整数不需要使用+,但负整数需要使用“-”;不同的投票选项之间用“|”隔开。
也可以用如下形式: “支持”|“反对”|“弃权”
与上面的例子相比,区别是没有分数。这种情况表明各个投票选项的权重是一样的。
首先投票项为非空格字符,长度为1-5,并用引号括起来,可以用"\S{1,5}"来表示,而后紧跟它所代表的分值,该分值可以是+1,-1或0,故分成三部分,此处由于加号和两个括号是正则表达式中有特殊意义的字符,故需要用 \转义,得到\(((\+1)|(-1)|(0))\),此时一个投票选项以及该投票选项所代表的分值对应的正则表达式已经匹配好,这是将它后面加一个|符号后再重复两次,并再加一个该表达式,就得到了权值不同的表达式。对于权重一样的形式,只需要去掉分数表示的部分即可,最终得到:
两种表达式均可以被匹配成功,即图中的match1和match2:
并附上该网站的网址:regex101: build, test, and debug regex
除了上述正则表达式中遇到的字符外,还有一些常用的正则表达式规则,总结如下:
a*:出现0次或多次 a+: a出现1次或多次
a? :a出现0次或1次 a{n} :a出现n次
a{m,n} :a出现m-n次 a{m,} :a出现m次以上
(a|b):匹配a或者b (ab) | (cd):匹配ab或者cd
[abc]:匹配a 或者b或者c [a-c] :同上
[a- fA-F0-9]:匹配小写+大写英文字符以及数字 [^0-9]:匹配非数字字符
\d :匹配数字字符 \D :匹配非数字字符
\w :匹配单词字符(英文、 数字、下划线) \W :匹配非单 词字符
\s:匹配空白符(包含换行符、Tab) \S:匹配非空白字符
.:匹配任意字符(换行符除外)