使用RegEx比较字符串时的一般速度问题
本文关键字:速度 问题 RegEx 比较 字符串 使用 | 更新日期: 2023-09-27 18:28:39
有没有办法提高这种方法的速度/效率?它在我的代码中被调用了数万次,并且正在减慢我正在开发的系统的速度。
基本上,"Field"有一个"Name"和一个"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);
}
我有两个解决方案。
一种是将预编译的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);
}
另一种是像这样使用静态Regex:
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);
}
哪一个最快取决于系统的规模,但两者都比以前的解决方案有很好的改进