C# RegularExpressions.Regex.IsMatch已挂起
以下是我的代码摘录:C# RegularExpressions.Regex.IsMatch已挂起,c#,regex,C#,Regex,以下是我的代码摘录: string[] myStr = { " Line1: active 56:09 - tst0063, tst0063", "Contacts accosiated with line 1 - tst0063, tst0063", "Line 1: 00:00:32 Wrap: 00:00:20 - tst0063, tst0063", "Line 1
string[] myStr =
{
" Line1: active 56:09 - tst0063, tst0063",
"Contacts accosiated with line 1 - tst0063, tst0063",
"Line 1: 00:00:32 Wrap: 00:00:20 - tst0063, tst0063",
"Line 1: 00:00:17 Active: 00:00:15 - tst0064, tst0064"
};
string sPattern = @"^Line(\s*\S*)*tst0063$";
RegexOptions options = RegexOptions.IgnoreCase;
foreach (string s in myStr)
{
System.Console.Write(s);
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern, options))
{
System.Console.WriteLine(" - valid");
}
else
{
System.Console.WriteLine(" - invalid");
}
System.Console.ReadLine();
}
RegularExpressions.Regex.IsMatch在处理最后一行时挂起。我做了一些实验,但仍然不明白为什么在最后没有比赛的时候它会挂起来。请帮忙 Move
System.Console.ReadLine()代码>在foreach
循环之外
您正在循环的第一次迭代结束时阻塞线程,等待用户输入。问题不在于为什么第四个测试挂起,而在于为什么前三个测试没有挂起。第一个字符串以空格开头,第二个字符串以联系人开头,两者都不匹配regex^Line
,因此前两次匹配尝试立即失败。第三个字符串与正则表达式匹配;虽然它需要比它应该需要的时间长得多(出于我将要解释的原因),但它似乎仍然是瞬间的
第四个匹配失败,因为字符串与正则表达式的结尾部分不匹配:tst0063$
。如果失败,正则表达式引擎将备份到正则表达式的变量部分,(\s*\s*)*
,并开始尝试所有不同的方法将其放入字符串中。与第三个字符串不同的是,这一次它必须尝试零个或多个空白字符(\s*
)和零个或多个非空白字符(\s*
)的每一种可能的组合,零次或多次,然后才能放弃。可能性不是无限的,但也可能是无限的
您可能想到了[\s\s]*
,这是一个用于匹配任何字符(包括换行符)的著名习惯用法。它在JavaScript中使用,JavaScript无法使点(
)与行分隔符字符匹配。大多数其他风格允许您指定更改点行为的匹配模式;有些人称之为DOTALL模式,但.NET使用更常见的单线模式
也可以使用内联修改器:
string sPattern = @"(?is)^Line.*tst0063$";
更新:对于您的评论,是的,regex引擎无法判断任何匹配必须以tst0063
结束,这似乎很奇怪。但这并不总是那么容易说出来。它应该投入多少精力来寻找这样的捷径?在所有匹配(成功或失败)变得太慢之前,你能在正常匹配算法上附加多少快捷方式
NET拥有最好的正则表达式实现之一:快速、强大,并且具有一些真正令人惊叹的特性。但你必须考虑你要它做什么。例如,如果您知道必须至少有一个,请使用+
,而不是*
。如果你遵循这个规则,你就不会有这个问题。此正则表达式:
@"^Line(\s+\S+)*tst0063$"
…很好用(\s+\s+*
是一种完全合理的匹配零个或多个单词的方法,其中单词定义为一个或多个非空白字符,由一个或多个空白字符与其他单词分隔。(这就是你想做的吗?我有相同的结果(挂在最后一行,没有匹配的结尾),即使我有两行以上。另外,当我调试它时,我可以看到它挂在IsMatch()下。使用这个模式怎么样<代码>^Line[\s*\s*]*tst0063$
圣诞快乐!编辑:4行,而不是2行,作为对下面答案的响应。@Picrofo软件它可以工作。似乎我做了些愚蠢的事。我去查一下。如果你愿意回答,我就接受。谢谢,圣诞快乐@Grant Winney它挂在端点不匹配的行上,这是前面提到的两种情况中的最后一个。但是,为什么它挂在()上?所有的线路都被检查得很快,但对于有问题的线路来说,它确实是挂着的——我等了几分钟,还是什么都没有。谢谢!但是为什么它会备份到第四个字符串上呢?端部不匹配,是否应报告故障并退出?
@"^Line(\s+\S+)*tst0063$"