关于这几天写php的作业,发现正则表达式真的好神奇啊,但对于我一个小白来说还是很绝望。
作业的内容是有关于匹配输入的中文数字,我搞了好几天,在网上却只能找到匹配全部中文,没有指定中文的,虽然明眼人都知道 /[中文]/ 这个正则表达式就可以匹配指定的中文字符了,所以我一开始写的是 /[一二三四五六七八九十]/ 这个表达式,可是还是不对,然后通过一系列百度,终于知道在正则表达式中
汉字的匹配有这个
[\u4e00-\u9fa5]
然后我就拿过来用了呀,我的天,所以我的写法就是 /[\u4e00-\u9fa5][[一二三四五六七八九十]/ 可惜还是不对,差点疯咯,因为用这个的时候报错了,因为啥呢?那是因为正则表达式中也有编码问题,我用的全局都是utf-8的编码方式所以啥不兼容的我也不太清楚,具体解决方法就是把这个汉字的匹配改为 /[\x{4e00}-\x{9fa5}]/u 这样子就可以在utf-8中匹配中文啦(关于为啥这样写就百度咯,可以了解一下)这样子我就可以匹配中文的汉字了,
然后我的作业是把中文的数字整个转换为‘***’号,所以我就这样写了 /([\x{4e00}-\x{9fa5}])[一二三四五六七八九十]+/ u 这样也倒是能够提取出中文的数字了,至于为什么有个‘+’号呢,因为没有加号的话这个表达式就会将每一个匹配的字符都换成‘***’而加了加号之后他就可以将整个几个连续的中文数字转换成‘***’ 就比如下面的意思
/([\x{4e00}-\x{9fa5}])[一二三四五六七八九十]+/ u 使用这个正则匹配 我今年二十岁
有加号就会变成:我今年***岁
没有加号就会变成:我今年******岁
然后就当我以为我要完工的时候,突然发现,我的每一次匹配都会把数字前面的一个字符给带上就像这样
我今年二十岁--->我今***岁
我当场崩溃,这是为啥???这个问题我也搞了好久(因为我是小白。。)后来在在线测试工具上发现,当我单独匹配一个字符的时候都会带上它前面的一个字符就比如
/([\x{4e00}-\x{9fa5}])[生]+/ u
我生活在我的生日
这句话匹配出来就是 “我生”和“的我”如下:
我生活在我的生日
这真的是很无奈呀,这之中的原理我也是不清楚,待我以后有时间再研究吧,不过这个问题的解决方式就是
这样:/([\x{4e00}-\x{9fa5}]{0}})[生]+/ u 在中文正则的后面加了一个{0}这个就是强制它的匹配数量为单个字符得到的结果也就是:
我生活在我的生日 这个啦!
(PS.我是个才接触的小白,真的就是想记录自己学习的过程,希望各位大佬看到有啥说的不对的地方可以指出来,求不被喷,O(∩_∩)O哈哈~)