使用RegEx比较字符串时的一般速度问题

时间:2014-10-30 15:54:45

标签: c# regex

有没有提高这种方法的速度/效率?它在我的代码中被称为数万次,并且正在减慢我正在开发的系统。

基本上,' Field'有一个名字'和价值'我需要检查它是否与我班级中相应属性的名称/值相匹配。 Field.Value也可以是正则表达式。我想正则表达式正在减慢一些事情。

    private bool FieldMatch(Field field)
    {
        var propValue = GetPropertyValue(field.Name);
        var regEx = new Regex(field.Value, RegexOptions.IgnoreCase);
        var stringMatch = string.Compare(propValue, field.Value, StringComparison.InvariantCultureIgnoreCase )
        return (stringMatch == 0) || regEx.IsMatch(propValue);
    }

1 个答案:

答案 0 :(得分:1)

我有两个解决这个问题的方法。

一种是将预编译的Regex添加到Field类中,如下所示:

public class Field
{

    public string Name { get; set; } // Should ultimately be an enum.

    public string Value { get; set; }

    public Regex RegexValue
    {
        get {
            return _regexValue ?? (_regexValue = 
                new Regex(Value, RegexOptions.Compiled | RegexOptions.IgnoreCase));
        }
    }

    private Regex _regexValue;

}

private bool FieldMatch(Field field)
{
    var propValue = GetPropertyValue(field.Name);
    var stringMatch = string.Compare(propValue, field.Value, StringComparison.InvariantCultureIgnoreCase);
    return (stringMatch == 0) || field.RegexValue.IsMatch(propValue);
}

另一种是使用静态正则表达式:

  private bool FieldMatch(Field field)
    {
        var propValue = GetPropertyValue(field.Name);
        var stringMatch = string.Compare(propValue, field.Value,                     StringComparison.InvariantCultureIgnoreCase);
        return (stringMatch == 0) || Regex.IsMatch(propValue, field.Value);
    }

哪一个最快取决于系统的规模,但两者都比以前的解决方案有了很好的改进