免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3667 | 回复: 14

求一个正规表达式写法(在线等) [复制链接]

论坛徽章:
0
发表于 2008-12-24 10:08 |显示全部楼层
my $str = "abc","begin""2"",""2""end","efg";
上面的字符串,我想分割成
abc
begin""2"",""2""end
efg

现在使用my @s = split(/","/, substr($str, 1, length($str)-2);
得到的是:
abc
begin""2"
"2""end
efg

如果使用my @s = split(/","/, substr($str, 1, length($str)-2);得到的是:
ab
egin""2"",""2""en
fg

请问哪位有好地解决办法。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2008-12-24 10:12 |显示全部楼层

回复 #1 HawaiiLeo 的帖子

你可以考虑用 look ahead,在 perlre 中搜索下看看要怎么用

论坛徽章:
0
发表于 2008-12-24 11:15 |显示全部楼层
$_ = q{"abc","begin""2"",""2""end","efg"};

print $1, ' | ', $2, ' | ', $3 if /"(\w{3})","(.*)","(\w{3})"/;


仅针对你给出的例子啊

论坛徽章:
0
发表于 2008-12-24 12:04 |显示全部楼层
感谢MMMIX大师的提示,使用perlre  look ahead能得到需要的结果
my $str = "abc","begin""2"",""2""end","efg";
my @s = split(/(?<!")","(?!")/, substr($str, 1, length($str)-2));

结果:
abc
begin""2"",""2""end
efg

谢谢cobrawgl

[ 本帖最后由 HawaiiLeo 于 2008-12-24 12:05 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
发表于 2008-12-24 12:17 |显示全部楼层
原帖由 HawaiiLeo 于 2008-12-24 12:04 发表
split(/(?<!")","(?!")/, substr($str, 1, length($str)-2));

学习

论坛徽章:
0
发表于 2008-12-25 13:42 |显示全部楼层
CSV文件各个项目可能包含有"和,的符号,出力的的时候把一个双引号都转换成了两个双引号,
如下的内容,怎么分割成正确的结果啊?
"abc"","",""bcd","","","123","",""

上面的内容我想得到
abc"","",""bcd


123

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
发表于 2008-12-25 13:48 |显示全部楼层

回复 #6 HawaiiLeo 的帖子

Excel打开,另存为*.txt

论坛徽章:
0
发表于 2008-12-25 14:01 |显示全部楼层
现在有两个Oracle数据库,因为其他原因不能用db link更新,也不能用固定长文件更新,
就想把数据从Oracle出力成CSV文件,然后和前一天的出力文件做差分,
再用差分结果去更新另外一个Oracle对应的表。

所以excel就不行了,而且linux环境,excel也没有啊。

论坛徽章:
0
发表于 2008-12-25 14:19 |显示全部楼层
我觉得你这个更适合用 parser 来做

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
发表于 2008-12-25 14:41 |显示全部楼层
Text::CSV 可以。http://search.cpan.org/dist/Text-CSV/lib/Text/CSV.pm
  1. #!/usr/bin/perl

  2. use Text::CSV;
  3. $csv = Text::CSV->new();

  4. $line=q("abc"","",""bcd","","","123","","");

  5. $status  = $csv->parse($line);# parse a CSV string into fields
  6. @columns = $csv->fields();

  7. for (@columns) {
  8.     print $_,"\n";
  9. }
  10. __DATA__
  11. "abc"","",""bcd","","","123","",""
复制代码
$ ./csv
abc",","bcd


123
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP