免费注册 查看新帖 |

Chinaunix

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

匹配中文字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-19 17:42 |只看该作者 |倒序浏览
本帖最后由 zaiai2014 于 2014-03-19 17:42 编辑

   我有这样的公式: 收入 = 门诊收入 + 住院收入, 还有一个哈希表,收入-> payin, 门诊收入 -> outp_payin, 住院收入 -> inp_payin。
  现在首先需要从公式中,将【收入】,【门诊收入】,【住院收入】这些中文字符串解析出来,然后替换为哈希表的相应值。

  1 。通过perl,首先的问题是字符集的问题, unicode, utf8,这些编码方式,从数据库提取出来,就需要进行decode等相应转化,这个就搞得不太清楚,希望有高手指点一二;
  2。然后就是如何解析出来中文字符串,英文的好像可以,有比较多的例子,中文字符的例子也很多\p{han}+,但是如何通过正则表达式解析中文字符串不太清楚。
  3。最后就是解析出来,进行替换。也会牵扯到字符串的替换,所以不能简单将收入都替换为payin,payin = 门诊payin + 住院payin。那就不是所想要的了。


  
  

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2014-03-19 18:33 |只看该作者
本帖最后由 jason680 于 2014-03-19 18:34 编辑

回复 1# zaiai2014

Windows中文 - 编码!编码!!
http://bbs.chinaunix.net/thread-1857627-1-1.html

【分享】Perl读取和生成、显示UTF-8文本、UTF-16文本
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4117501


simple example for your reference

$ cat pay.pl
#! /usr/bin/perl

use strict;
use warnings;

use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');

my %hTr = (
  收入 => "payin",
  门诊收入 => "outp_payin",
  住院收入 => "inp_payin",
);
while(<DATA>){
  print $_;
  my $cnt = 0;
  while(m/(\p{han}+)/g){
    print ++$cnt,"=$1\n";
  }
  s/(\p{han}+)/$hTr{$1}/g;
  print "En: $_";
}

__DATA__
收入 = 门诊收入 + 住院收入

$ ./pay.pl
收入 = 门诊收入 + 住院收入
1=收入
2=门诊收入
3=住院收入
En: payin = outp_payin + inp_payin

   

论坛徽章:
0
3 [报告]
发表于 2014-03-20 07:46 |只看该作者
先接受我的感谢!特别感谢。我试试看。

论坛徽章:
0
4 [报告]
发表于 2014-03-20 21:02 |只看该作者
本帖最后由 zaiai2014 于 2014-03-20 21:03 编辑

也许是perl版本的问题,您的代码不能正确执行。
我使用的是Ubuntu 12.04 , perl 5.14.2
下面的正确执行:
----------------------------代码-----------------------------------------------
#!/usr/bin/perl

#解决了汉字匹配的问题,原因不太明白。20140320 绥德
use v5.14.2;


use utf8;
#use Encode qw(encode);
use open ":encoding( utf8 )", ":std";

my %hTr = (
  收入 => "payin",
  门诊收入 => "outp_payin",
  住院收入 => "inp_payin",
);

say %hTr;


while(<DATA>){
  print $_;
  my $cnt = 0;
  while(m/(\p{han}+)/g){
    say ++$cnt,"=$1\n";   
  }
  s/(\p{han}+)/$hTr{$1}/g;
  print "En: $_"
}

my $forum = "收入 = 门诊收入 + 住院收入";

#$forum = encode("UTF-8",$forum);

say $forum;

if ($forum =~ m/(\p{han}+)/g) {
    say "matched $1";
}


$forum =~ s/(\p{han}+)/$hTr{$1}/g;

say $forum;


__DATA__
收入 = 门诊收入 + 住院收入

----------------------------代码-----------------------------------------------


运行的结果,
hengaini@hengaini:~/temp/chinese$ perl chinese_replace.pl
住院收入inp_payin门诊收入outp_payin收入payin
收入 = 门诊收入 + 住院收入
1=收入
匹配了!
2=门诊收入
匹配了!
3=住院收入
匹配了!
En: payin = outp_payin + inp_payin
收入 = 门诊收入 + 住院收入
matched 收入
payin = outp_payin + inp_payin

论坛徽章:
0
5 [报告]
发表于 2014-03-22 08:09 |只看该作者
在windows 7 下面,还需要修改一下,如下代码:

#!/usr/bin/perl

#解决了汉字匹配的问题,原因不太明白。20140320 绥德
use v5.14.2;


use utf8;
#use Encode qw(encode);
use open ":encoding(gbk)", ":std";  #注意这里999999

my %hTr = (
  收入 => "payin",
  门诊收入 => "outp_payin",
  住院收入 => "inp_payin",
);

say %hTr;


while(<DATA>){
  print $_;
  my $cnt = 0;
  while(m/(\p{han}+)/g){
    say ++$cnt,"=$1\n";   
  }
  s/(\p{han}+)/$hTr{$1}/g;
  print "En: $_"
}

my $forum = "收入 = 门诊收入 + 住院收入";

#$forum = encode("UTF-8",$forum);

say $forum;

if ($forum =~ m/(\p{han}+)/g) {
    say "matched $1";
}


$forum =~ s/(\p{han}+)/$hTr{$1}/g;

say $forum;


__DATA__
收入 = 门诊收入 + 住院收入

运行的情况如下:
c:\temp\perl\programming>perl chinese_replace.pl
住院收入inp_payin门诊收入outp_payin收入payin
收入 = 门诊收入 + 住院收入
1=收入

2=门诊收入

3=住院收入

En: payin = outp_payin + inp_payin
收入 = 门诊收入 + 住院收入
matched 收入
payin = outp_payin + inp_payin



论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-03-09 06:20:00
6 [报告]
发表于 2014-03-24 14:03 |只看该作者
是Perl做的医院管理?

论坛徽章:
0
7 [报告]
发表于 2014-03-28 19:10 |只看该作者
说对了,就是这个业务范围。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP