免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4593 | 回复: 24
打印 上一主题 下一主题

perl正则匹配复杂数据类型问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-12-23 09:42 |只看该作者 |倒序浏览
本帖最后由 justu78 于 2016-12-23 15:01 编辑

我不是寻求解决方案的,这是咨询出现问题的代码的原因:
我有一个小文件,每行数据都是逗号分隔。但是有一行数据是空格分隔, 我想查找到这一行,然后直接把空格替换成逗号就好了,很简单吧,但是我最开始的想法出问题了,我这里想请假一下为什么我的匹配不成功。
代码很简单,我就是一开始定义了一个字符窜变量$number='(?:[+-]?)(?:[0-9]+[\.]?[0-9]*)|(?:[\.][0-9]+)(?:[eE][+-]?[0-9]+)?' , 然后用这个变量来匹配只有数据是空格分隔的某一行:/^\s*($number\s+)+ /,  我个人感觉这个正则表达式没有问题,但是最后运行结果显示是没有匹配到。请高手帮我解惑,这是为什么?(我知道最后换个方式解决其实非常简单,我只想知道为什么我想的这个正则表达式匹配不成功)

数据文件:
*
*All and any part of this file format is copyright protected.
*
3.2E-8,  .0016,  25,  70,  1,  1,  2,  3,  4,  5
2.15E-13 1.77E-13 8.48E-13 1.515E-12 2.501E-12 4.583E-12  .01245   1.32

0,  1,  .02

代码:
#!/bin/sh
eval 'exec perl -S -x -w $0 ${1+"$@"}'
#!perl
$self   = $0;
$\      = "\n";
$,      = " ";
$number = '(?:[+-]?)(?:[0-9]+[\.]?[0-9]*)|(?:[\.][0-9]+)(?:[eE][+-]?[0-9]+)?';
opendir( DIR, "." ) ||
    die("ERROR: cannot open current directory, stopped");
@Files = grep( /^[^\.]/, readdir(DIR) );
closedir(DIR);
print $self;
foreach $file (@Files) {
    $temp = quotemeta $file;
    if ( $self =~ /$temp/i ) {
        next;
    }
    print "processing data file: $file;";
    $newfile = 'new_' . $file;
    local $/;
    open($IN, '<', "$file" ) || die("ERROR: cannot open file $file, stopped");
    $line = <$IN>;
    close($IN);
    @lines = split( /\n/, $line );
    $/ = "\n";
    open( $OUT, '>', "$newfile" ) || die("ERROR: cannot open file $newfile, stopped");
    print "writing new data file: $newfile;";
    for ( $i = 0; $i <= $#lines; $i++ ) {
        if ( $lines[$i] =~ /^\s*($number\s+)+ /i ) {
          $lines[$i] =~ s/\s+/\,/ig;
       }
        print $OUT $lines[$i];
    }
    close($OUT);
}

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
2 [报告]
发表于 2016-12-23 11:09 |只看该作者

  1. echo '*
  2. *All and any part of this file format is copyright protected.
  3. *
  4. 3.2E-8,  .0016,  25,  70,  1,  1,  2,  3,  4,  5
  5. 2.15E-13 1.77E-13 8.48E-13 1.515E-12 2.501E-12 4.583E-12  .01245   1.32

  6. 0,  1,  .02'|sed -r '/\*|,|^\s*$/b;s/\s+/,  /g'
复制代码

论坛徽章:
0
3 [报告]
发表于 2016-12-23 12:30 |只看该作者
回复 2# moperyblue

不好意思,没看明白

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
4 [报告]
发表于 2016-12-23 12:32 |只看该作者
回复 3# justu78


有效果吗? 符合你要求吗?

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
5 [报告]
发表于 2016-12-23 12:45 |只看该作者
^(?:[+-]?)((?:[0-9]+[\.]?[0-9]*)|(?:[\.][0-9]+))(?:[eE][+-]?[0-9]+)?
再试下,

论坛徽章:
0
6 [报告]
发表于 2016-12-23 13:04 |只看该作者

我没明白您的意思,我需要改哪里?您贴的代码是改了哪里呢

论坛徽章:
0
7 [报告]
发表于 2016-12-23 13:21 |只看该作者

你就是加了两个括号把,我试了还是一样的结果,匹配不到正确的数据行

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
8 [报告]
发表于 2016-12-23 13:27 |只看该作者
回复 6# justu78

more urfile
  1. *
  2. *All and any part of this file format is copyright protected.
  3. *
  4. 3.2E-8,  .0016,  25,  70,  1,  1,  2,  3,  4,  5
  5. 2.15E-13 1.77E-13 8.48E-13 1.515E-12 2.501E-12 4.583E-12  .01245   1.32

  6. 0,  1,  .02
复制代码

more 1.sh
  1. #!/bin/sh
  2. sed -r '/\*|,|^\s*$/b;s/\s+/,  /g' urfile
复制代码

  1. chmod +x 1.sh
复制代码
  1. ./1.sh
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2016-12-23 14:47 |只看该作者
回复 7# justu78
将处理的情况简化先,依旧使用我修改后的那个表达式 你看下结果?!


论坛徽章:
0
10 [报告]
发表于 2016-12-23 14:54 |只看该作者
本帖最后由 justu78 于 2016-12-23 14:57 编辑
sunzhiguolu 发表于 2016-12-23 14:47
回复 7# justu78
将处理的情况简化先,依旧使用我修改后的那个表达式 你看下结果?!

我是想问我设置了$number这个变量,用在正则里面,然后用($number\s+)+ 这种方式为什么不行呢?,看起来我这个语法和你的几乎是一样的,而且我还考虑了后面还有其他数据,彼此也是空格间隔的情况
因为我知道怎么绕开这个问题,我最后的代码直接把任意数据间的逗号变为空格,然后把空格变为逗号,这样不管有没有逗号,空格,最后都是逗号间隔
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP