-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;
}
4

3 回答 3

3

如果模式没有改变,你就不需要每次都编译它。使其成为静态的。

于 2013-08-27T19:52:48.743 回答
1

如果您只想让模式匹配整个输入,只需使用^$锚定到您的模式。

^匹配输入的开头,而$匹配输入的结尾。通过将它们分别放置在您的实际模式之前和之后,您只允许在输入的开头和在输入的结尾结束的匹配。简而言之:匹配必须覆盖整个输入。

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

不要重新发明轮子!;-)

于 2013-08-27T19:57:47.583 回答
0

您似乎表明您的问题与不断编译的正则表达式有关。

假设您为此函数提供不同的模式,为什么不缓存已编译的正则表达式?

(如果您只是在函数中扔掉那个 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;
}
于 2013-08-29T16:36:16.493 回答