找回密码
 加入
搜索
查看: 7719|回复: 10

[AU3基础] 【已解决】求帮助正则替换首尾数字,中间数字与中文不变,制表符分割

  [复制链接]
发表于 2013-1-27 19:50:26 | 显示全部楼层 |阅读模式
本帖最后由 longsir 于 2013-1-28 18:47 编辑
64        1330063        上海 上海        中国电信 CDMA        021        200000
65        1330064        上海 上海        中国电信 CDMA        021        200000
67        1330066        上海 上海        中国电信 CDMA        021        200000
81        1330080        上海 上海        中国电信 CDMA        021        200000
300001        1850000        北京 北京        中国联通 GSM\/3G        010        100000
300002        1850539        山东 临沂        中国联通 GSM\/3G        0539        276000
300003        1850733        湖南 株洲        中国联通 GSM\/3G        0731        412000
300004        1850831        四川 宜宾        中国联通 GSM\/3G        0831        644000
300005        1851394        北京 北京        中国联通 GSM\/3G        010        100000
300006        1852576        辽宁 葫芦岛        中国联通 GSM\/3G        0429        125000
300007        1853441        山西 太原        中国联通 GSM\/3G        0351        030000
300008        1854588        黑龙江 哈尔滨        中国联通 GSM\/3G        0451        150000
300009        1855031        江苏 苏州        中国联通 GSM\/3G        0512        215000
300010        1855928        福建 厦门        中国联通 GSM\/3G        0592        361000
300011        1856058        山东 临沂        中国联通 GSM\/3G        0539        276000
300012        1856698        广东 东莞        中国联通 GSM\/3G        0769        523000
300013        1857040        湖南 岳阳        中国联通 GSM\/3G        0730        414000
300014        1857055        湖南 郴州        中国联通 GSM\/3G        0735        423000
替换后为:
1857055,湖南 郴州        中国联通 GSM\/3G
1330080,上海 上海        中国电信 CDMA

前面数字最多6位,最少1位。中间制表符分割。后边区号3-4位,最后邮编是6位
怎么写正则呢?
发表于 2013-1-27 20:25:32 | 显示全部楼层
MsgBox(0,"",StringRegExpReplace(ClipGet(),'\d+\h+(\d+)\h+(\H+\h\H+\h+\H+\h\H+)\h+\d+\h+\d+',"$1,$2"))
哈哈 写得一塌糊涂 只能证明我思考过。。。。。。来学习楼下的。
发表于 2013-1-27 20:25:34 | 显示全部楼层
本帖最后由 afan 于 2013-1-27 20:44 编辑

木有制表符...
StringRegExpReplace($str, '(?m)^\d+\h+(\d+)\h+(.+)\h+\d+\h+\d+', '$1,$2')
发表于 2013-1-27 20:30:43 | 显示全部楼层
$str = FileRead("1.txt")
MsgBox(0,"",$str)
$regexp=ObjCreate("vbscript.regexp")
With $regexp
        .global=1
        .multiline=1
        .pattern="^\S+\t(\S+)\t(.*?)(\t\S+){2}$"
        $str=.replace($str,"$1,$2")
EndWith
$regexp=null
MsgBox(0,"",$str)
这个试下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-1-27 22:15:29 | 显示全部楼层
如果是固定数据 ,而且 只需要处理一次. 这种数据 我一般用 excel 处理 .
 楼主| 发表于 2013-1-27 22:24:03 | 显示全部楼层
回复 2# zch11230
这个办法可以的,完全可行,但是我那个全部是文本文件。


回复 3# afan
也可以,但不知道怎样输出到文本。

回复 4# kevinch
这个方法有点问题出现了错误
E:\bak\crack\cxs.au3(5,16) : 错误: missing separator character after keyword.
        .global=
~~~~~~~~~~~~~~~^
E:\bak\crack\cxs.au3(10,13) : 错误: 表达式错误
$regexp=null
~~~~~~~~~~~~^
E:\bak\crack\cxs.au3 - 2 错误, 0 警告
文本文件大概有27万条记录,太多了。大家在给个完整点的,谢谢了。
 楼主| 发表于 2013-1-27 22:25:49 | 显示全部楼层
回复 5# sunless


    我也试过excel ,不错,但是最大支持65535行,我那个27万条记录,完了还得排序。所以才用到正则
发表于 2013-1-27 22:29:47 | 显示全部楼层
回复 3# afan

呵,用(?m)的确能使表达式清晰简单,不过,若串非常大,那么这种效率就低点了。因为这样的话,(.+)需要回溯的次数太多了,也需要更多的缓存来保存结果。当然对一般不大的文本而言,这种非常好。

评分

参与人数 1金钱 +30 收起 理由
afan + 30 谢谢指点~

查看全部评分

发表于 2013-1-28 14:34:33 | 显示全部楼层
回复 6# longsir
装excel2007或2010吧,支持1048576行,27万行已经小意思了
 楼主| 发表于 2013-1-28 18:46:19 | 显示全部楼层
回复 9# kevinch


    哦,那也只能这样了。
发表于 2013-2-3 22:59:08 | 显示全部楼层
学习楼上楼上的。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-26 21:40 , Processed in 0.093439 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表