需求是统计工程里所有中文字符(中文注释除外),并且整理到word文档中。例如,工程里一个带有中文字符的文件如下:
统计结果:
如果中文字符串数量很少,我们完全可以手动一个一个统计,但如果数量很多,几百几千个中文字符,在一个一个手动统计怕是要累死人。而用正则表达式就可以轻松地完成统计。
首先我们用正则表达式匹配文件里(java)所有带有双引号的中文字符。刚开始我用的表达式是:"[\u4e00-\u9fa5]+"
结果发现只能匹配引号中是纯中文的字符串,像"您输入的昵称长度不正确,请重新输入","昵称中不可有空格,请重新输入!","昵称中包含敏感字符,请重新输入【",这些都无法匹配到。正确的表达式应该是:"(?:[^"\\]|\\.)*"
这样就能匹配所有带有双引号的字符了。
不难看出,如果匹配所有纯中文字符(不带引号),那应该用的正则表达式是:[\u4e00-\u9fa5]
这样是一个汉字一个汉字地匹配的。当然,这里前后的双引号也可以换成其他符号,比如换成单引号就是匹配带有单引号(被单引号包括)的字符,换成小括号就是匹配带有小括号(被小括号包括)的字符……
总结一下就是:
匹配所有双引号内的纯中文字符:"[\u4e00-\u9fa5]+"
匹配所有双引号内的字符:"(?:[^"\\]|\\.)*"
匹配成功后,我们可以通过整体替换,提取出来所有匹配的字符。比如我们这个,我们先把要统计的文档粘贴到notepad++里(其他编辑工具也可以),由于我们要获取引号内的字符,那我们只需要把引号外的内容删除掉,剩下的就是我们想要的。但是问题是我们怎么才能删掉引号外的内容呢?其实上面我们已经找到了方法,还是用正则表达式,我们在文本的开头加上一个引号,如下图所示:
然后,我们从文档最开始搜索替换,输入我们前面的匹配带有双引号的字符的正则表达式:
切记光标一定要放在文档最前头,也就是我们加的那个引号之前,否则匹配会混乱。如果不确定可以先点击“查找下一个”看看匹配是否正确,确定无误后,点击全部替换,结果如下:
最后我们只需要把文本最前面的一个引号和逗号去掉,再在文本最后加上一个引号,就得到要求的统计结果了。
如果有更好的方法,希望不吝赐教!