C#正则表达式匹配失败

C#正则表达式匹配失败

问题描述:

这里的正则表达式模式:C#正则表达式匹配失败

string testerpattern = @"\s+\d+:\s+\w\w\w\w\w\w\s+..:..:..:..:..:..:..:..\s+\d+.\d+.\d+.\d+\s+\d+.\d+.\d+.\d+\s+""\w +"""; 

下面是几行文本我想匹配。在行的开头会有一个或多个空格。当我得到它的工作,我会修改它进行命名匹配。基本上我希望大部分线路不需要为每个模式在一条线路上进行多个匹配。

2: fffc02 10:00:00:05:1e:36:5f:82 172.31.3.93  0.0.0.0   "SAN002A" 
3: fffc03 10:00:00:05:1e:e2:a7:00 172.31.3.168 0.0.0.0   "SAN003A" 
4: fffc04 50:00:51:e8:cc:2f:ae:01 0.0.0.0   0.0.0.0   "fcr_fd_4" 

这里是我写的做静态类匹配。它在我的程序的其他地方工作,所以我认为这是一个问题的模式。该模式成功匹配上Regexr.com

public static class RegexExtensions 
{ 
    public static bool TryMatch(out Match match, string input, string pattern) 
    { 
     match = Regex.Match(input, pattern); 
     return (match.Success); 
    } 

    public static bool TryMatch(out MatchCollection match, string input, string pattern) 
    { 
     match = Regex.Matches(input, pattern); 
     return (match.Count > 0); 
    } 
} 
+1

会删除'\ w'和'+'末双引号内解决问题之间的空间? – dasblinkenlight

+0

是的,就是这样。我一直在盯着这个15分钟试图弄清楚。新的问题......其中一个输入行可能在行结尾处的左手双引号之前有一个“>”。我知道正则表达式匹配会是\?为0或1,但我怎么逃避,让C#不认为它是命名匹配的一部分?或者如果在比赛之前存在,用空白替换它会更容易吗?我试过'\> \?'作为一种逃避,这场比赛失败了。 –

+0

转义单个字符的另一种方法是使用方括号,即'[>]?' – dasblinkenlight

首先,当然删除\w+之间的空间,如果您打算匹配一个或多个单词字符。

接下来,如果您需要匹配字面点,则必须将其转义 - \.,或放入字符类 - [.]

此外,您还可以使用限制量词缩短模式如果你不需要捕获。看你的图案如何可以写为:

string pat = @"\s+\d+:\s+\w{6}\s+(?:..:){7}..(?:\s+\d+(?:\.\d+){3}){2}\s+""\w+"""; 

参见regex demo(其中\w{6}比赛6“字”字符,(?:..:){7}匹配比2个换行符以外的任何字符7个序列随后与:等)

如果需要捕获,还是,你可以用我上面列出的想法:

\s+(\d+):\s+(\w{6})\s+(..(?::..){3}):((?:..:){3}..)\s+(\d+(?:\.\d+){3})\s+(\d+(?:\.\d+){3})\s+"(\w+)" 

regex demo

enter image description here

+0

我需要捕获。我通过用[]包围'>'来解决它。我还发现,虽然C#允许您在分配的下一行继续字符串的值,但会打破正则表达式匹配。在代码中,我为了可读性而在2行上有模式,所以我不必向右滚动以查看整个模式,点使用C#@“”语法来处理字符串文字 –

+0

无匹配的'.'匹配任何符号,但换行符,如果它在那里,它将匹配'§'。查看我的更新建议*,以您的价值观为基础捕获群组*。 –