.net 什么';我的正则表达式怎么了?

.net 什么';我的正则表达式怎么了?,.net,regex,c++-cli,.net,Regex,C++ Cli,我正在使用System::Text::RegularExpressions::Regex尝试在日志文件中查找启动消息。我的表述如下: using namespace System::Text::RegularExpressions; Regex^ logStartRegex = gcnew Regex( "^=+ .* \\((\\d+)/(\\d+)/(\\d+) @ (\\d+):(\\d+):(\\d+)\\) (.*) =+", static_cast<RegexOptions&g

我正在使用
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) );
"^=+ [^(]* \\((\\d+)/(\\d+)/(\\d+) @ (\\d+):(\\d+):(\\d+)\\) ([^=]*) =+"
…但当我执行以下操作时,我没有找到匹配项:

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

我已经测试了它,它指示了它的工作原理(注意,在C++版本中,我们必须要避开所有的‘字符’):<代码> ^=+**((\d+)/(\d+)/(\d+)](\d+):(\d+):(\d+)\(.*)= +< /代码>。有没有办法知道这到底是哪里出了问题?

我刚刚尝试了以下程序,它是从您提供的程序复制过来的:

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;
}
使用名称空间系统;
使用命名空间System::Text::RegularExpressions;
int main(数组^args)
{
Regex^logStartRegex=gcnew Regex(“^=+.\\(\\d+)/(\\d+)/(\\d+)/(\\d+)@(\\d+):(\\d+:(\\d+)\)(.=+”,静态转换(RegexOptions::Compiled | RegexOptions::IgnoreCase));
Match^Match=logStartRegex->Match(=============Logging started(07/10/2011@15:38:54)v1.000 AA000=============\n”);
控制台::WriteLine(匹配->成功);
控制台::ReadKey();
返回0;
}

它将
True
写入屏幕,表示找到了匹配项。所以我想问题应该在你的程序中的其他地方。

< P>我相信这应该遵循.NETFramework正则表达式味道的约定,虽然我不太了解C++了。但是,如果它不这样做,并且更倾向于Java实现和API,并且类似于[Regex]
Matcher.matches()
方法,它将尝试将Regex与整个源代码进行匹配(如果它不匹配整个源代码,但可能只匹配部分源代码,则尝试将失败)。Net调用
Regex.Match()
函数将在提供的输入中找到表达式,如果找到则返回true

这是一个很长的说法:确保您的输入字符串不包含任何尾随空格或其他字符

还有一个注意事项-如果您的输入实际上是多行的,特别是在其他行包含括号中的日期和时间的情况下
()
-您的表达式包含应用于点字符类“
”的贪婪量词,这至少会使它在大输入时运行非常缓慢,如果不是这样的话,就把它绊倒,让它失败

在任何情况下,您都可以通过将
*
的实例分别更改为
[^(]*
[^=]*
来提高表达式的效率,如下所示:

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

您要替换的贪婪量词会多次匹配整个字符串,然后多次回溯,最后在它开始说“哦,好吧,这匹配……下一步是什么?”后返回到十到二十个字符的位置

你明白了;结果发现我的一个测试字符串略有不同,我没有发现它。当我把我的示例缩减到这里发布时,我选择了工作字符串-d'oh!:-)