2010-03-18 40 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§§用於引用。