要想在C语言里玩转正则,咱们可以直接用POSIX标准里的regex.h,这样就能体验到模糊匹配带来的爽感了。整个过程其实挺简单,一共就三步。首先是用regcomp()函数,把你写好的字符串模式编译成内部格式,这就好比把原材料做成了能用的零件。编译完以后就可以用regexec()来跑匹配了,跑完了再用regfree()把内存给释放了。 扩展正则表达式(REG_EXTENDED)通常都是默认开启的,这样就能用|、()、{}这些语法糖了,功能比普通正则强大不少。如果你想忽略大小写,直接把REG_ICASE传进去就行。要是只是想验证格式,不关心匹配结果,加个REG_NOSUB能省点内存。遇到文本里有换行符的情况,千万别忘带上REG_NEWLINE。下面这段代码把这三步流程都封装好了,以后用起来就方便多了。 比如拿"Hi, 2016!"来举例看效果。单字符匹配里,.在C里默认只能匹配单个字符,前面那个反斜杠是转义符;\w代表字母或数字,\W是它的对立面。注意在C语言字符串里写反斜杠得写成两个,这就是为什么你看到的是"\\w"。 字符数量匹配能让模式变得灵活。比如{2}要求前导字符正好出现两次,?让"0"变成可选的,+表示"1"至少出现一次。用{1,5}就能把数字范围限定在1到5位之间,这样不管是"Hi,"还是"Hi, 20160422!"都能匹配上。 位置匹配可以定行首行尾。用^锚定行首,$锚定行尾。中间的要求得严格按顺序来,比如"Hi,"开头、空格、8位数字、末尾感叹号。 选择匹配能解决多形态的问题。像(com|COM)就把大小写都包进来了。[5-6e-y]{6}限定后缀前6位只能是5、6、e等这些字符。 这篇文章只是讲了最常用的一批规则。像定位匹配、分组捕获这些高级玩法还有待后续实战再聊。想写更高效的验证逻辑,记得把常用模式提前编译缓存起来。遇到长字符串或复杂模式,试试分块匹配或者用递归调用把问题分解开。祝你编码愉快!