2016-09-15 136 views
0

這裏的正則表達式模式: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

回答

0

首先,當然刪除\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

無匹配的'.'匹配任何符號,但換行符,如果它在那裏,它將匹配'§'。查看我的更新建議*,以您的價值觀爲基礎捕獲羣組*。 –