免费注册 查看新帖 |

Chinaunix

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

请问如何转换掉括号之外的字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-12 15:07 |只看该作者 |倒序浏览
比如我有这样一个文件


  1. b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(______)b5c8b9a6c4dcb2bfbcfea1a3
  2. b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9d3c3(______)a1a3
  3. cfd4cabec6f7b5c4c7e5cefab6c8cac7d3c9(______)bef6b6a8b5c4a1a3
  4. d2bbb0e3c0b4cbb5a3ac(______)d6d0b5c4cafdbeddb2bbc4dcb1bbc9beb3fda1a3
  5. d4dacea2bbfab5c4d3b2bcfecfb5cdb3d6d0a3ac(______)cac7bcc6cbe3bbfab5c4bcc7d2e4b2bfbcfea1a3
  6. bcfcc5ccb4f2d7d6bcfcc7f8b5c4(8)b8f6bbf9d7bcbcfccebbcac7d6b8(______)a1a3
  7. d4dacea2bbfad6d0a3ac(______)cda8b3a3d3c3c0b4b4e6b7c5(BIOS)b3ccd0f2a3acd2f2b4cbd2b2bdd0(BIOS)d0bec6aca1a3
复制代码


我想把括号之外的字符串转换对应的ascii
对perl刚学,写的代码搞不定,请各位大侠指点下
注意,括号内的内容并不是一样的
我的代码如下(如果狗屁不通,请多包涵)

  1. #! /usr/bin/perl
  2. my $s = "d4dacea2bbfad6d0a3ac&______,cda8b3a3d3c3c0b4b4e6b7c5&BIOS,b3ccd0f2a3acd2f2b4cbd2b2bdd0&BIOS,d0bec6aca1a3";
  3. $s =~ /(.*?)&(.*?),(.*?)(&|,|\n|\s)/g;
  4. $a=pack( 'H*',$1);
  5. $b=pack( 'H*',$3);
  6. $s =~ s/$1&(.*?),$3[&|,|\s|\n]/$a$1$b/gs;
  7. print $s;

复制代码

本来我的文件是要转换  &  与  , 之外的字符串的
考虑到便于大家看清楚我所需要转换的字符串
我贴文件上来的时候就把
& 换成 (
,  换成 )

所以我的代码是用& 与,隔开的

不知道表达的清楚不清楚

请大家帮忙,万分感谢

[ 本帖最后由 roby 于 2007-12-12 15:11 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-12-12 16:49 |只看该作者
use strict;
use warnings;
my $str=q/
b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(______)b5c8b9a6c4dcb2bfbcfea1a3
b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9d3c3(______)a1a3
cfd4cabec6f7b5c4c7e5cefab6c8cac7d3c9(______)bef6b6a8b5c4a1a3
d2bbb0e3c0b4cbb5a3ac(______)d6d0b5c4cafdbeddb2bbc4dcb1bbc9beb3fda1a3
d4dacea2bbfab5c4d3b2bcfecfb5cdb3d6d0a3ac(______)cac7bcc6cbe3bbfab5c4bcc7d2e4b2bfbcfea1a3
bcfcc5ccb4f2d7d6bcfcc7f8b5c4(8)b8f6bbf9d7bcbcfccebbcac7d6b8(______)a1a3
d4dacea2bbfad6d0a3ac(______)cda8b3a3d3c3c0b4b4e6b7c5(BIOS)b3ccd0f2a3acd2f2b4cbd2b2bdd0(BIOS)d0bec6aca1a3
/;
$str=~s/([[:xdigit:]]{2})/chr(oct("0x$&"))/ge;
print "-->$str<--\n";

论坛徽章:
0
3 [报告]
发表于 2007-12-12 17:37 |只看该作者
感谢楼上的朋友
看兄弟的代码又学习了

但是
我这里有个特殊情况
那就是如果是
(CAD)cac7bcc6cbe3bbfad6d8d2aad3a6d3c3c1ecd3f2a3accbfcb5c4baacd2e5cac7(______)a1a3
cda8b3a3cbf9cbb5b5c4(CPU)d0bec6acb0fcc0a8(______)a1a3
d1a7c9fab3c9bca8b9dcc0edc8edbcfecaf4d3da(______)a1a3
(PC)b5c4baacd2e5cac7(______)a1a3
这样子的
那么会有点问题

也就是说括号当中如果也有十六进制数字的话,那么也会转换,但是我的意思是括号当中不管是什么,都不要去管它
不知道应该怎么去解决
请指点

[ 本帖最后由 roby 于 2007-12-12 19:37 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-12-12 19:31 |只看该作者
不好意思
顶一下
恳请各位帮忙

论坛徽章:
0
5 [报告]
发表于 2007-12-12 22:07 |只看该作者
改一下,刚才走了个弯路


  1. my $str=q/
  2. b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(__abcd__)b5c8b9a6c4dcb2bfbcfea1a3
  3. b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9d3c3(______)a1a3
  4. cfd4cabec6f7b5c4c7e5cefab6c8cac7d3c9(______)bef6b6a8b5c4a1a3
  5. d2bbb0e3c0b4cbb5a3ac(______)d6d0b5c4cafdbeddb2bbc4dcb1bbc9beb3fda1a3
  6. d4dacea2bbfab5c4d3b2bcfecfb5cdb3d6d0a3ac(______)cac7bcc6cbe3bbfab5c4bcc7d2e4b2bfbcfea1a3
  7. bcfcc5ccb4f2d7d6bcfcc7f8b5c4(8)b8f6bbf9d7bcbcfccebbcac7d6b8(______)a1a3
  8. d4dacea2bbfad6d0a3ac(______)cda8b3a3d3c3c0b4b4e6b7c5(BIOS)b3ccd0f2a3acd2f2b4cbd2b2bdd0(BIOS)d0bec6aca1a3
  9. /;

  10. my @array;
  11. while($str =~ s/(\(.*?\))/##/){
  12.     push @array,$1;
  13. }
  14. #$str =~ s/(\(.*?\))/##/g;
  15. $str=~s/([[:xdigit:]]{2})/chr(oct("0x$&"))/ge;
  16. my $i=0;
  17. my $b;
  18. $str=~s/##/$b=$array[$i];$i++;$b/ge;
  19. print "\n",$str;
复制代码

[ 本帖最后由 redicaps 于 2007-12-12 22:16 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-12-12 23:47 |只看该作者
      1 #!/usr/bin/perl

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 use strict;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4 use warnings;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5 my $str=q/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6 (CAD)cac7bcc6cbe3bbfad6d8d2aad3a6d3c3c1ecd3f2a3accbfcb5c4baacd2e5cac7(______)a1a3
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7 cda8b3a3cbf9cbb5b5c4(CPU)d0bec6acb0fcc0a8(______)a1a3
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8 d1a7c9fab3c9bca8b9dcc0edc8edbcfecaf4d3da(______)a1a3
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9 (PC)b5c4baacd2e5cac7(______)a1a3
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10 /;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12 print &handle ($str) ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15 sub handle {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16    my $tmp = shift @_ ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17    if ($tmp =~ /([^\(]*)(\(.*?\))(.*)/s) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18      &handle ($1) . $2 . &handle ($3) ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19    } else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20      $tmp =~ s/([[:xdigit:]]{2})/chr(oct("0x$1"))/ge ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;21      $tmp ;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22    }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;23 }


运行: ./to_ascii.pl

(CAD)是计算机重要应用领域,它的含义是(______)。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______

论坛徽章:
0
7 [报告]
发表于 2007-12-12 23:54 |只看该作者
原帖由 __lxmxn__ 于 2007-12-12 16:49 发表
use strict;
use warnings;
my $str=q/
b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(______)b5c8b9a6c4dcb2bfbcfea1a3
b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9 ...



外面再套一层, 选出()外面的东西先:
for ($str =~ /([^()]+)(?=\(|$)/g) {
    ... ...
}

论坛徽章:
0
8 [报告]
发表于 2007-12-13 09:20 |只看该作者
原帖由 老手 于 2007-12-12 23:47 发表
      1 #!/usr/bin/perl

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 use strict;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4 use warnings;
&nbsp;&nbsp;&nbsp;&nbsp; ...



学习了,大虾能否解析下?看不懂

论坛徽章:
0
9 [报告]
发表于 2007-12-13 11:26 |只看该作者
非常感谢楼上各位兄台
学习了

论坛徽章:
0
10 [报告]
发表于 2007-12-13 11:34 |只看该作者
原帖由 liang573728 于 2007-12-13 09:20 发表



学习了,大虾能否解析下?看不懂


设计思路是:

根据所处理字符串的特点, 将其分解成 "括号前" "某个括号住的内容" "括号后"三部分; 分别处理前后两部分,再与不处理的括号部分拼接而成.

这里说的"括号前""括号后" 是针对某一个括号而言的 , 这两个部分本身还可能包含其他括号 . 那么继续层层划分直到剩下的部分不再有括号.

这种特点最容易用"递归"实现. 上面代码中 handle 就是一个递归函数.

     17    if ($tmp =~ /([^\(]*)(\(.*?\))(.*)/s) {
     18      &handle ($1) . $2 . &handle ($3) ;

就把要处理的串分解成: 括号前$1 部分 , 括号及括住内容部分$2 , 括号后$2部分.
前后两部分要处理 , 所以用了handle . 18 行把处理完的部分和原来的$2部分拼接完后返回.

17,18 完成拆解和再拼接,真正的转化是在被分解的部分不再含有"括号"后进行的:

     19    } else {
     20      $tmp =~s/([[digit:]]{2})/chr(oct("0x$1")/ge ;
     21      $tmp ;
     22    }

针对串:

(CAD)是计算机重要应用领域,它的含义是(______)。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______)。

第一层调用handle , 将以"(CAD)"为界将整串拆成:
1.1  " "
1.2  "(CAD)"
1.3  "是计算机重要应用领域,它的含义是(______)。
     通常所说的(CPU)芯片包括(______)。
     学生成绩管理软件属于(______)。
     (PC)的含义是(______)。"
3个部分. 对1和3再调用handle分别处理.


对上面1的 " "串 , 由于已经没了括号 , 所以再次handle处理时,将执行:
     19    } else {
     20      $tmp =~s/([[digit:]]{2})/chr(oct("0x$1")/ge ;
     21      $tmp ;
     22    }

对上面3的 "是计算机重要应用领域,它的含义是(______)。
     通常所说的(CPU)芯片包括(______)。
     学生成绩管理软件属于(______)。
     (PC)的含义是(______)。"
其实形式和没有分解前没什么两样 , 再次使用handle分解成:
2.1  "是计算机重要应用领域,它的含义是"
2.2  "(______)"
2.3  "。
     通常所说的(CPU)芯片包括(______)。
     学生成绩管理软件属于(______)。
     (PC)的含义是(______)。"

2.1直接处理,2.3再用handle.

如此下去,最终会被分解到最后一个"。" 至此分解和处理过程结束,接下来就是层层拼接返回的过程.


这样解释不知道有没有道清楚. 我是以其他语言的思路来写的 , 我是perl新手 . perl语法方面的,还是请"flw""Lonki"等perl大牛们来释疑.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP