免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: guobiao_cn
打印 上一主题 下一主题

[文本处理] 【已解决】各位好,我碰到字符串加表达式的匹配问题,麻烦帮助看看,先谢了。 [复制链接]

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
11 [报告]
发表于 2014-06-19 18:14 |只看该作者
源文本,目标文本,给例子说清楚吧

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
12 [报告]
发表于 2014-06-19 18:16 |只看该作者
回复 10# 用户名注册后不能更改
多谢解释,这样吗?
  1. sed -r '/<ResultCode>0{8}<\/ResultCode>/d;s/.*(<ResultCode>.*<\/ResultCode>).*/\1/' i
  2. <ResultCode>10100900</ResultCode>
  3. <ResultCode>51999999</ResultCode>
复制代码

论坛徽章:
0
13 [报告]
发表于 2014-06-19 21:45 |只看该作者
回复 10# 用户名注册后不能更改


    这位同志说得是这样的,谢谢。

论坛徽章:
0
14 [报告]
发表于 2014-06-19 21:49 |只看该作者
回复 12# Herowinter

要求要<ResultCode>和</ResultCode>之间的内容(包括两个<>),此外,当中间的部分是00000000时,不要。


我按着您的方法输
1111111111111
012014-06-19 00:00:01934116ionID><ResultCode>10100900</ResultCode></ns3:Response>
012014-06-19 00:00:02013311ionID><ResultCode>00000000</ResultCode></ns3:Response>
012014-06-19 00:01:01017381ionID><ResultCode>51999999</ResultCode></ns3:Response>
22222222222222222222

当还会显示出 1111111111111 和 22222222222222222222 来。

我只想匹配有<ResultCode>10100900</ResultCode></ns3:Response>的行,但中间的8位数据不是00000000的。

辛苦您好,可否续着帮助着想怎么样写这个上匹配表达式好些呢, 我是做云计算数据报文分析,因此这对我来还是比较重要。

再次感谢各位。
   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
15 [报告]
发表于 2014-06-19 22:04 |只看该作者
本帖最后由 Herowinter 于 2014-06-19 22:22 编辑

回复 14# guobiao_cn
  1. sed -r '/<ResultCode>[0-9]{8}<\/ResultCode>/!d;s/.*(<ResultCode>.*<\/ResultCode>).*/\1/;/0{8}/d' i
复制代码
这样应该可以,家里没环境,手写的,未测试。

   

论坛徽章:
0
16 [报告]
发表于 2014-06-19 23:42 |只看该作者
本帖最后由 guobiao_cn 于 2014-06-19 23:55 编辑

回复 15# Herowinter

very good!  不错,可以达到要求!

这里我对您写的表达式有一个问题?
  1. sed -r '/<ResultCode>[0-9]{8}<\/ResultCode>/!d;s/.*(<ResultCode>.*<\/ResultCode>).*/\1/;/0{8}/d'
复制代码
这里是从找出<ResultCode>[0-9]{8}<\/ResultCode>所有的行, 然后再寻找出中间的数,这里会浪费些性能。
是否会有更高效的的办法呢或放能追求较高质量的代码吗, 因此有时局方人员会核审写的代码质量。

另能否解释下以下的动作:
1、!d是什么意思? 要找出这一行来,为何有一个不等号! 因为扩展表达式里它的含意不同吗,也就是匹配出来了,但不显示别的行吗?
2、后面()是当成一个整体来看待?
3、\1为何要转义?这里匹配一次吗?
4、这写会类于grep -o  因此把此行的关键时字打印来了,但不显示这行的内容, 如我想完整显示这行呢?

辛苦您了,真诚的感谢。

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
17 [报告]
发表于 2014-06-19 23:59 |只看该作者
本帖最后由 Herowinter 于 2014-06-19 23:59 编辑

回复 16# guobiao_cn
  1. sed -nr '/<ResultCode>[0-9]{8}<\/ResultCode>/s/.*(<ResultCode>.*<\/ResultCode>).*/\1/p;/0{8}/!p' i
复制代码
试试这个吧,不知道手写的会不会有语法错误。
以面试官的要求来说,我确实只写出了60分的代码。
   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
18 [报告]
发表于 2014-06-20 00:05 |只看该作者
本帖最后由 Herowinter 于 2014-06-20 00:05 编辑

回复 16# guobiao_cn
  1. 1. !取反,表示当前模式空间内容不匹配给定的正则,d删除模式空间内容
  2. 2.3. 第一对()里的内容对应的就是\1,具体参见正则中的反向引用或捕获
  3. 4. 打印整行简单多了,2-4楼的代码不都是打印整行,你不是说没达到你的需求吗?
复制代码

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
19 [报告]
发表于 2014-06-20 00:16 |只看该作者
回复 16# guobiao_cn

说实话,这问题回这么多贴和你自己描述得不是很清楚有关系,
你早给这个文本会误导大家这么久?
  1. 1111111111111
  2. 012014-06-19 00:00:01934116ionID><ResultCode>10100900</ResultCode></ns3:Response>
  3. 012014-06-19 00:00:02013311ionID><ResultCode>00000000</ResultCode></ns3:Response>
  4. 012014-06-19 00:01:01017381ionID><ResultCode>51999999</ResultCode></ns3:Response>
  5. 22222222222222222222
复制代码
grep -Pv "0{8}"只不过会显示上面的 1111....  22222..这种行而已,
而你在1楼的需求里根本没提这种情况。

打印整行的话应该这样可以。
  1. sed -r '/<ResultCode>[0-9]{8}<\/ResultCode>/!d;/0{8}/d' i
复制代码

论坛徽章:
0
20 [报告]
发表于 2014-06-20 01:12 |只看该作者
回复 19# Herowinter
  1. grep -Po '(?<=D>)((?!00000000).)*(?=</n)'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP