2011-10-19 43 views
0

我使用System::Text::RegularExpressions::Regex嘗試在日誌文件中查找啓動消息。我的表達式如下:我的正則表達式有什麼問題?

using namespace System::Text::RegularExpressions; 
Regex^ logStartRegex = gcnew Regex("^=+ .* \\((\\d+)/(\\d+)/(\\d+) @ (\\d+):(\\d+):(\\d+)\\) (.*) =+", static_cast<RegexOptions>(RegexOptions::Compiled | RegexOptions::IgnoreCase)); 

...和我的測試數據:

========= Logging started (07/10/2011 @ 15:38:54) v1.000 AA000 ========= 

...但是當我做了以下我沒有得到一個匹配:

logStartRegex->Match("========= Logging started (07/10/2011 @ 15:38:54) v1.000 AA000 =========\n"); 

我已經在regexpal中測試過了,它指示它有效(注意在C++版本中我們必須轉義所有'\'字符):^=+ .* \((\d+)/(\d+)/(\d+) @ (\d+):(\d+):(\d+)\) (.*) =+。有什麼方法可以看到這個問題到底發生了什麼?

回答

1

我只是嘗試了下面的程序,從你提供了什麼複製:

using namespace System; 
using namespace System::Text::RegularExpressions; 

int main(array<System::String ^> ^args) 
{ 
    Regex^ logStartRegex = gcnew Regex("^=+ .* \\((\\d+)/(\\d+)/(\\d+) @ (\\d+):(\\d+):(\\d+)\\) (.*) =+", static_cast<RegexOptions>(RegexOptions::Compiled | RegexOptions::IgnoreCase)); 
    Match^ match = logStartRegex->Match("========= Logging started (07/10/2011 @ 15:38:54) v1.000 AA000 =========\n"); 
    Console::WriteLine(match->Success); 
    Console::ReadKey();  
    return 0; 
} 

它寫出True到屏幕上,這意味着它找到了一個匹配。所以我想這個問題一定是在你的程序中的其他地方。

+0

你懂了;事實證明,我的一個測試字符串有些微不同,我沒有發現它。當我削減我的例子在這裏發佈後,我選擇了工作 - 德哦! :-) –

1

我相信這應該遵循.Net框架正則表達式風格的約定,儘管我不再很瞭解C++ ......如果它不是,並且更傾向於Java實現和API,就像[Regex] Matcher.matches()方法一樣,它會嘗試匹配整個源的正則表達式(如果它不匹配整個源,但可能只匹配它的一部分,則嘗試失敗)。在.NET調用Regex.Match()功能查找在所提供的輸入表達式,並返回true,如果發現

這是說的很長的路要走:請確保您輸入的字符串中不包含任何尾隨空格或其他字符。

還要說明一點 - 如果你的輸入實際上是多條線路,尤其是在其他行包含日期和時間在括號() - 你的表情包括應用於點字符類「.」至少會使其運行貪婪量詞非常緩慢的大型輸入,如果不是以某種方式將它絆倒,並使其失敗。

在任何情況下,你可以讓你的表情有點更有效的通過改變.*實例分別[^(]*[^=]*,如下:

"^=+ [^(]* \\((\\d+)/(\\d+)/(\\d+) @ (\\d+):(\\d+):(\\d+)\\) ([^=]*) =+" 

貪婪量詞,你將取代原本匹配整個弦多次,然後多次回溯,直到最後回到十或二十個字符後,纔開始說「哦,好吧,這匹配......下一步是什麼?」

相關問題