找回密码
 加入
搜索
查看: 3924|回复: 5

[系统综合] 【已解决】求一正则 内容很有规律但要求有点多

[复制链接]
发表于 2013-1-10 00:12:28 | 显示全部楼层 |阅读模式
本帖最后由 zch11230 于 2013-1-11 09:36 编辑

一个专业工具的发送和返回数据包,公司内部的不太方便说名字,因为配套的软件功能比较局限,研究了一下这些数据,已经得到了需要的内容,文本内容比较多,通常是达10W+行,开始用的笨办法一行一行的读,能达到效果太效率太差了 试了一下正则,一个文件一秒都要不到,速度爽多了,但是在正则匹配更多内容的时候遇到了麻烦,不知该如何写

需要得到的数据就3个,以第40行中的10 07 17 00 09 0C为标志
1:标志行最临近的日期和时间,前后无所谓
2:第56行第34和35个字符 也就是01,规律是该行位于标志行后的第16行 或者是标志行后第二个以00000020h:开头的行,这个是不变的 。
前面两个数据我的正则是
10 07 17 00 09 0C.+\n.+\n.+\n.+\n(\d{4}-\d{2}-\d{2}  \d{2}:\d{2}:\d{2}).+\n.+\n.+\n.+\n.+\n.+\n.+\n.+\n.+\n.+\n.+\n.+\n.{33}(.{2}) 
现在我需要第3个数据,规律是标志行向前面数,第一个以10 07 10 00 03 或者 10 07 10 00 04开头的行,需要得到是03还是04,示例中在第二行的25和26字符,为03,这一行的位置不固定,因为中间有可能会穿插一些其它数据包。
还有一个要求如果有多个符合条件的要都匹配出来
我的
(?s)10 07 10 00 (03|04) 0C.+?10 07 17 00 09 0C.+?(\d{4}-\d{2}-\d{2}  \d{2}:\d{2}:\d{2}).+?00000020h:.{23}(.{2})
03|04是匹配的从开头向下数最近的 而不是从标志行处倒着往上数最近的。示例中一开头就是需要的03,所以看似正确,但实际中如果前面还有以04开头的行 就匹配成04了,求正则达人给个准备的表达式或者指点一二,感谢!
2012-12-23  19:10:39  SEND
00000000h:  10 07 10 00 03 0C 17 13 - 0A 27 00 00 00 00 00 00
00000010h:  00 00 00 00 F7 5E 00 10 - 08 FD D6

2012-12-23  19:10:39  RECV
00000000h:  10 06 F7 5E 00

2012-12-23  19:10:39  SEND
00000000h:  10 05 F8 5E 00

2012-12-23  19:10:41  RECV
00000000h:  10 07 35 00

2012-12-23  19:10:41  RECV
00000000h:  03 79 50 78 70 78 70 98 - 19 FF 3F 56 50 00 00 00
00000010h:  00 27 1F 00 00 00 90 E7 - 6B 3B 10 00 00 00 00 00
00000020h:  00 00 00 00 00 12 80 08 - 15 01 01 01 00 00 00 00
00000030h:  00 FF A1 00 00 F8 5E 00 - 10 08 83 73

2012-12-23  19:10:41  SEND
00000000h:  10 07 10 00 07 0C 17 13 - 0A 29 00 00 00 00 00 00
00000010h:  00 00 00 00 F9 5E 00 10 - 08 D0 AF

2012-12-23  19:10:41  RECV
00000000h:  10 06 F9 5E 00

2012-12-23  19:10:41  SEND
00000000h:  10 05 FA 5E 00

2012-12-23  19:10:42  RECV
00000000h:  10 07 35 00

2012-12-23  19:10:42  RECV
00000000h:  07 79 50 78 70 78 70 98 - 19 FF 3F 56 50 00 00 00
00000010h:  00 27 1F 00 00 00 90 E4 - 6B 3B 10 00 00 00 00 00
00000020h:  00 00 00 00 00 02 80 08 - 15 01 01 01 00 00 00 00
00000030h:  00 00 00 00 00 FA 5E 00 - 10 08 8F 20

2012-12-23  19:11:54  SEND
00000000h:  10 07 17 00 09 0C 17 13 - 0B 2A 00 0C 00 00 00 00
00000010h:  00 00 00 00 00 00 00 00 - 00 00 00 0D 5F 00 10 08
00000020h:  8B 30

2012-12-23  19:11:55  RECV
00000000h:  10 06 0D 5F 00

2012-12-23  19:11:56  SEND
00000000h:  10 05 0E 5F 00

2012-12-23  19:12:00  RECV
00000000h:  10 07 A5 00

2012-12-23  19:12:00  RECV
00000000h:  09 79 50 38 70 39 70 98 - 19 FE 3F 56 50 00 00 00
00000010h:  00 67 1F 00 00 00 80 B7 - 69 1B 10 00 00 00 00 00
00000020h:  00 00 00 00 00 00 00 01 - 37 01 01 00 00 00 00 00
00000030h:  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000040h:  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000050h:  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000060h:  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000070h:  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000080h:  00 00 00 00 00 00 00 00 - 00 00 00 01 00 00 00 00
00000090h:  00 01 00 00 00 12 80 08 - 01 01 01 01 00 00 00 00
000000A0h:  00 00 00 00 00 0E 5F 00 - 10 08 AC 0F
发表于 2013-1-10 17:17:48 | 显示全部楼层
本帖最后由 Duvet 于 2013-1-10 17:57 编辑
#Include <Array.au3>
Local $aResult = StringRegExp(ClipGet(), "(?:10 07 1(?>0 00 (?=0[34] 0C)|7 00 09 0C(?:\V+\v+){3})|\G[SR](?:\V+\v+){9}.{33})(\d\d(?:\d.{17})?)\s+", 3)
_ArrayDisplay($aResult, UBound($aResult))
 楼主| 发表于 2013-1-10 22:17:40 | 显示全部楼层

RE: 求一正则 内容很有规律但要求有点多

回复 2# Duvet


    感谢回复 可能我描述得有点歧义,全部匹配是说如果有多组同时符合这几个条件的 就都匹配出来 不单独匹配某一个条件,朋友的表达式好高深啊 还有帮助中都没介绍的贪婪子表达式,因为标志后面的那两个数据位置都是固定的,没什么难度,实在不行我直接取位置也可以,关键是取标志前最近的03或04不会,还请指教一下,打个简单点的比方 有文本
11 22 aaa 123 22 11 aaa 123
123为标志 aaa是中间的随机无用数据 现在要匹配123之前最接近的11 或 22 比如这里就应该匹配出红色字的内容 [0]22 [1]11
发表于 2013-1-11 00:09:06 | 显示全部楼层
看這問題時確實是對這部分有疑問,看樣子我語文能力真的要好好加強才行
試試這個↓
#Include <Array.au3>
Local $aResult = StringRegExp(ClipGet(), "(?s)10 07 10 00 (0[34]) 0C(?:(?!10 07 10 00 0[34] 0C|10 07 17 00 09 0C).)+10 07 17 00 09 0C(?:\V+\v+){3}(.{20})..[SR](?:\V+\v+){9}.{33}(\d\d)", 3)
_ArrayDisplay($aResult, UBound($aResult))
发表于 2013-1-11 00:12:35 | 显示全部楼层
本帖最后由 Duvet 于 2013-1-11 00:22 编辑
"(?s)10 07 10 00 (0[34]) 0C(?:(?!10 07 10 00 0[34] 0C).)+?10 07 17 00 09 0C(?:\V+\v+){3}(.{20})..[SR](?:\V+\v+){9}.{33}(\d\d)"
 楼主| 发表于 2013-1-11 09:36:14 | 显示全部楼层
果然好用 非常感谢帮忙 只是还没有完全理解到表达式的意思 下来再好好消化一下。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-5 19:53 , Processed in 0.078719 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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