2010-03-18 42 views
0

我一直在研究正则表达式来解析一系列SQLIO运行的输出。我已经相当远了,但尚未完成。我正在寻求一个100%的正则表达式解决方案,并且不需要预先处理输入。任何人都可以帮助一些指导与下面的正则表达式:正则表达式帮助解析SQLIO输出

.*v(?<SQLIOVersion>\d\.\d).*\n.*\n(?<threads>\d*)\s.*for\s(?<Seconds>\d+).*\n.*using\s(?<clustersize>[0-9]*)KB.*\n.*\n.*size:\s(?<currentfilesize>\d+).*\n.*\n.*\n.*\n.*\s(?<IOs>\d*\.\d*).*\n.*\s(?<MBs>\d*\.\d*).*\n.*\n.*\s(?<MinLatency_ms>\d+).*\n.*\s(?<AvgLatency_ms>\d+).*\n.*\s(?<MaxLatency_ms>\d+).*\n.*\n.*\n\%\:..(?<ms>\d*\s+)* 

下面是输出的一个片段 - 注意头,其中SQLIO批处理期间变化:File

+0

你有什么问题? /(? \ d * \ s +)* /并不代表您可能会想到的内容,它只会为您提供最后一个值,而不是一系列值。你可能想要类似/(?(?:\ d + \ s +)+)/。你使用什么语言/工具? – Qtax 2010-03-18 16:27:39

+0

好吧,我没有收到艾伦在答案中已经确定的所有条目。关于直方图中的ms,我实际上是通过指定的表达式获取值的列表(无法让您的建议工作?)。然而,由于某种原因,最后的值还包括CR LF。还没有完全想到这一点。我正在使用expresso作为编辑器。 – jaspernygaard 2010-03-18 16:56:57

+0

尝试更改'\%\:..(? \ d * \ s +)*'到'%:(? + \ d +)+'。您似乎认为'\ s'只能匹配空格,但它也与换行匹配(以及其他几个字符)。只是供参考,'%'和':'不需要逃脱,但这没有任何伤害。 – 2010-03-18 20:49:08

回答

1

的问题似乎是这里:

using 8KB random IOs 
    buffering set to use hardware disk cache (but not file cache) 

捕获簇的大小后,可以使用.*\n消耗才去捕捉文件大小的第二行,但有时还有第三行:

using 8KB random IOs 
    enabling multiple I/Os per thread with 8 outstanding 
    buffering set to use hardware disk cache (but not file cache) 

我将(?:.*\n)?添加到正则表达式的相关部分,现在它匹配所有36个条目。

我知道你想要去100%的正则表达式,但你有没有考虑用扩展格式写评论(即,IgnorePatternWhitespace模式)?我还建议在正则表达式中使用更多的文字文本,以便更容易遵循。例如,

(?<threads>\d+) threads? reading for (?<Seconds>\d+) secs.*\n 

,而不是

(?<threads>\d*)\s.*for\s(?<Seconds>\d+).*\n 

不可读的代码是不可维护的代码,和正则表达式需要各方面的帮助,他们可以得到的。 : -/

+0

我怎么可能错过那一个。谢谢! 我将不得不看看更友好的阅读格式。我绝对不会在2-3周内理解我自己的表情:) – jaspernygaard 2010-03-18 16:59:03

0

地狱与计数线,只要顺序不变,你可以做以下事情。哦,并使用/ x的大正则表达式有所帮助。 ;)

qr§ 
^sqlio\s+v(?<SQLIOVersion>\d+\.\d+) 

(?> # atomic match, dont backtrack in here when matched 
.{0,400}? # dont match so far that we can get the next result 
(?<threads>\d+)\s+thread) 

(?>.{0,400}? 
\b for\s+(?<Seconds>\d+)\s*sec) 

(?>.{0,400}? 
\b using\s+(?<clustersize>\d+)\s*KB) 

(?>.{0,400}? 
\b size:\s+(?<currentfilesize>\d+)) 

(?>.{0,400}? 
\b IOs/sec\D*(?<IOs>\d+\.\d+)) 

(?>.{0,400}? 
\b MBs/sec\D*(?<IOs>\d+\.\d+)) 

(?>.{0,400}? 
\b Min_Latency\D*(?<MinLatency_ms>\d+)) 

(?>.{0,400}? 
\b Avg_Latency\D*(?<AvgLatency_ms>\d+)) 

(?>.{0,400}? 
\b Max_Latency\D*(?<MaxLatency_ms>\d+)) 

(?>.{0,400}? 
^\%:\s*(?<ms>(?:\d+\s+)+)) 

§mixs 

PCRE/Perlqr§§用于引用。