我一直在使用一个正则表达式来解析一系列SQLIO运行的输出。我已经走得相当远了,但还没有完全走到那一步。我正在寻求一个100%正则表达式的解决方案,没有预操作的输入。有没有人可以提供一些关于以下正则表达式的指导:
.*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
发布于 2010-03-19 00:30:03
问题似乎出在这里:
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模式)?我还建议在regex中使用更多的文字文本,这样更容易理解。例如,
(?<threads>\d+) threads? reading for (?<Seconds>\d+) secs.*\n而不是
(?<threads>\d*)\s.*for\s(?<Seconds>\d+).*\n不可读的代码是不可维护的代码,正则表达式需要所有它们可以得到的帮助。:-/
发布于 2010-03-19 01:11:31
让计数行见鬼去吧,只要顺序不变,你可以做下面的事情。哦,在大型正则表达式中使用/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+)+))
§mixsPCRE/Perl qr§用于报价。
https://stackoverflow.com/questions/2470836
复制相似问题