【问题标题】:Regex.Match, startat and ^ (start of string)Regex.Match、startat 和 ^(字符串开头)
【发布时间】:2011-05-04 14:23:51
【问题描述】:

有人知道为什么会输出这段代码吗:

Regex re = new Regex("^bar", RegexOptions.Compiled);
string fooBarString = @"foo bar";

Match match1 = re.Match(fooBarString, 4);
Console.WriteLine(String.Format("Match 1 sucess: {0}", match1.Success));

Match match2 = re.Match(fooBarString.Substring(4));
Console.WriteLine(String.Format("Match 2 sucess: {0}", match2.Success));

是:

匹配 1 成功:错误

匹配 2 成功:是的

?

预期的行为当然是“真”和“真”(否则我真的不知道“startat”参数应该有什么用处)。

这个想法是这种正则表达式匹配(并且有很多)被非常频繁地调用(每秒几次),我们发现子字符串操作正在扼杀内存性能。

感谢您的帮助!

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    根据 MSDN

    如果你想限制匹配,那么 它始于一个特定的 字符串中的字符位置和 正则表达式引擎不 扫描字符串的其余部分以查找 匹配,锚定正则表达式 带有 \G (在左侧为 从左到右的模式,或在右边 对于从右到左的模式)。这 限制比赛,所以它必须开始 正好在 startat。

    正则表达式与整个字符串匹配,您需要使用 \G 而不是 ^

    http://msdn.microsoft.com/en-us/library/3583dcyh.aspx

    【讨论】:

      【解决方案2】:

      听起来你是对的 - 你对 ^ 的含义感到困惑。 ^ 表示您正在使用的行的开头。 ^bar 只会匹配 begin 与 "bar" 的行,这是你用 Substring 人工完成的。如果您解释一下您想用它做什么,我们或许可以为您提供帮助。

      顺便说一句,Substring 应该明显比大多数正则表达式操作快。如果这会影响你的表现,我会很惊讶。

      【讨论】:

      • 重新性能:如果Substring 使用底层Chars 的新副本创建一个新的String 对象(我很确定它确实如此),你会这样做除了正则表达式匹配。事实上,OP 确实说问题出在内存使用上,而不是速度上,这使得 Substring 成为主要嫌疑人。幸运的是,正如 @Maxime 的 answer 所示,无论如何都不需要它。
      • @Alan - 是的,我犯了一个错误,将性能考虑在速度而不是内存方面(并不是说Substring 不会是速度上的打击,顺便说一句,只是它很可能是比正则表达式本身少得多)。 @Maxime 更好地理解了海报想要做什么,所以他得到了我的 +1。重新使用 Substring 方法 - does construct a new string,因为字符串在 C# 中是不可变的。
      • @JustinMorgan 实际上,不变性使得不必创建新字符串成为可能,字符串可能只指向子字符串。它不这样做的原因与垃圾收集有关。
      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多