Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RegularExpressions.Regex.IsMatch已挂起_C#_Regex - Fatal编程技术网

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$"