2013-08-27 168 views
-3

代碼看起來很愚蠢,每次調用時都會預編譯正則表達式,並丟棄局部變量。這個塊似乎會造成一些延遲。有沒有更好的方法來做到這一點?正則表達式優化

public const string REGEX_NUMERIC = @"^\-?\(?([0-9]{0,3}(\,?[0-9]{3})*(\.?[0-9]*))\)?$"; 

public static bool IsExactMatch(string input, string pattern) 
{ 
    if (IsEmpty(input)) return false; 
    System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(input, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
    if (!m.Success) return false; 
    return m.Groups[0].Value == input; 
} 
+1

你不能簡單地添加一個'^'和'$'到模式,所以它只能匹配*完整的輸入*?也就是說,匹配必須在輸入開始時開始,並在輸入結束時結束。 –

+3

請不要刪除舊的問題並重新發布相同的問題。正如前面提到的,如果僅僅使用一次,那麼編譯正則表達式就沒有意義。 – keyboardP

回答

3

如果模式沒有改變,則不需要每次編譯它。使其靜態。

1

如果您只希望模式匹配整個輸入,只需使用^ and $ anchors您的模式。

^匹配輸入的開始,而$匹配輸入的結尾。通過將這些分別放置在實際模式之前和之後,您只允許在輸入結束時啓動開始,並在輸入結束時啓用結束。簡而言之:匹配必須覆蓋整個輸入的整個

var pattern = new Regex('^foo$'); 
Console.WriteLine(pattern.Matches('foo')); // => true 
Console.WriteLine(pattern.Matches('foobar')); // => false 
Console.WriteLine(pattern.Matches('lolfoo')); // => false 

不要重新發明輪子! ;-)

+0

public const string REGEX_NUMERIC = @「^ \ - ?\(?([0-9] {0,3}(\ ,? [0-9] {3})*(\。?[0-9] * ))\)$?「;這是我正在使用的模式。 – iam

+0

@iam然後,這應該「只是工作」™。如果沒有,請在你的問題中澄清你的問題。 –

0

您似乎表示您的問題是圍繞不斷編譯的正則表達式進行的。

假設您爲此函數提供了不同的模式,爲什麼不緩存編譯後的Regexes?

(這也將工作,如果你只是折騰是REGEX_NUMERIC的功能,但絕對算是大材小用。)

public const string REGEX_NUMERIC = @"^\-?\(?([0-9]{0,3}(\,?[0-9]{3})*(\.?[0-9]*))\)?$"; 
private static Dictionary<string, Regex> regexes = new Dictionary<string, Regex>(); 

public static bool IsExactMatch(string input, string pattern) 
{ 
    if (string.IsNullOrEmpty(input)) return false; 

    Regex regex; 
    if (!regexes.TryGetValue(pattern, out regex)) 
    { 
     regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
     regexes.Add(pattern, regex); 
    } 

    Match m = regex.Match(input); 
    if (!m.Success) return false; 
    return m.Groups[0].Value == input; 
}