正则表达式问题 给了一行数据,这行数据有五个字段,我用正则匹配了一下(.{8,8})(.{4,4})(.{4,4})(.{20,20})(.{13,13}),如果是都是半角的话,没有问题,但是如果里面某个字段含有汉字的话,就会匹配不上。请问如何处理呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 下面是一条数据,这条数据的空格都是必要的。U0000227900300001TRJ-01 4522646434118女性上着 000007510001000100000600000000那我就拿实际的了,都是实际数据正则表达式@"(U)(.{8})(.{4})(.{4})(.{20})(.{13})(.{32})(.{36})(.{36})(.{20})(.{8})(.{4})(.{4})(.{6})(.{6})(.)(.)"};请过客大侠帮忙看看吧 我不是太明白楼主的意思,不过如果你的一行数据不能确定是否有汉字的话,你应该将{}内的数字写成最小程度和最大长度的形式,{13,13}这样的写法,确实画蛇添足。 我的意思是,如果你需要13个字符的输入,而此时偶尔需要输入汉字的话,那么可以使用{13,n},其中n是一个大于13的数字。 我只是提提意见,说不对勿见怪。 如果解决不了,还是建议重看下《C#字符串和正则表达式参考手册》 .net程序运行时,string内部都是unicode编码的,汉字、英文都算一个字符。如果你需要把一个汉字算成2个字符,可以先做一个替换:str = Regex.Replace(str, "[\u4e00-\u9fa5]", "\\$&");这样就可以把“女性上着”替换成“\女\性\上\着”,然后再用你的正则去匹配就可以了,最后得到结果后,再从结果中去掉“\”:result = result.Replace("\\", "");上面的办法比较复杂,其实解析格式化数据报文可以用更简单的方法,直接从字节流中读取指定编码的字符串就可以了。比如读入数据保存在buf中,buf是一个字节数组,用:Encoding.GetEncoding("gb2312").GetString(buf, 1, 8);可以读出第一个字段的字符串,9,4是第二个字段,13,4是第三个字段,以此类推 str = Regex.Replace(str, "[\u4e00-\u9fa5]", "\\$&");这个不管用啊。 本帖最后由 lxcnn 于 2010-10-11 11:01:49 编辑 这里有一个原来解决的问题,但愿对你有帮助http://topic.csdn.net/u/20100420/18/86ba3d12-f4ef-4036-9eb8-f465af0684e0.html 字段之间没有空格那就比较麻烦了,因为是按字节数统计的个数,正则无法区分某个字符究竟是前一字段,还是后一字段的能不能从数据源考虑一下,为什么会产生这样的数据源,这种数据源,采用哪种方式处理都是比较麻烦的当然,因为字节数固定,自己写方法foreach遍历,判断每个字符是单字节还是双字节,然后按字节数提取字段也是可以的,就是字段太多,实现起来比较麻烦,不易扩展,变成体力活了而已 ado.net中,连接对象何时能够手动open/close,何时可以自动的open/close呢?有一定的约定吗? C#如何获取指定目录的最新的一个文件? 请教C#正则表达式 MapXtreme 2008 和vs2005开发地图的流程 csc编译器dos下不支持太长的整个项目编码如何解决? 文件传输问题 如何在程序运行时拖动界面上的控件到另一个位置 ADO.NET数据集模型 有时候 运行报错 数据库不能open,有时候正常。 asp.net+c#怎样实现这样的功能 求助.关于C#编程中类的对象和定义变量的问题!! winform中如何让richtextobx支持越南文 300分 请教c# & java达人
正则表达式@"(U)(.{8})(.{4})(.{4})(.{20})(.{13})(.{32})(.{36})(.{36})(.{20})(.{8})(.{4})(.{4})(.{6})(.{6})(.)(.)"};请过客大侠帮忙看看吧
我的意思是,如果你需要13个字符的输入,而此时偶尔需要输入汉字的话,那么可以使用{13,n},其中n是一个大于13的数字。
我只是提提意见,说不对勿见怪。
如果解决不了,还是建议重看下《C#字符串和正则表达式参考手册》
如果你需要把一个汉字算成2个字符,可以先做一个替换:
str = Regex.Replace(str, "[\u4e00-\u9fa5]", "\\$&");
这样就可以把“女性上着”替换成“\女\性\上\着”,然后再用你的正则去匹配就可以了,最后得到结果后,再从结果中去掉“\”:result = result.Replace("\\", "");上面的办法比较复杂,其实解析格式化数据报文可以用更简单的方法,直接从字节流中读取指定编码的字符串就可以了。比如读入数据保存在buf中,buf是一个字节数组,用:
Encoding.GetEncoding("gb2312").GetString(buf, 1, 8);
可以读出第一个字段的字符串,9,4是第二个字段,13,4是第三个字段,以此类推
这个不管用啊。