2011-10-19 23 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+)\\) ([^=]*) =+" 

贪婪量词,你将取代原本匹配整个弦多次,然后多次回溯,直到最后回到十或二十个字符后,才开始说“哦,好吧,这匹配......下一步是什么?”

相关问题