【发布时间】:2013-10-23 04:20:10
【问题描述】:
我有一个带有文本框的应用程序。用户在此框中输入文本。
我在该文本框中的 OnKeyUp 事件中触发了以下函数
private void bxItemText_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
// rules is an array of regex strings
foreach (string rule in rules)
{
Regex regex = new Regex(rule);
if (regex.Match(text.Trim().ToLower()))
{
// matched rule is a variable
matchedRule = rule;
break;
}
}
}
我在rules 中有大约 12 个字符串,尽管这可能会有所不同。
一旦文本框中的文本长度超过 80 个字符,性能就会开始下降。在 100 个字符后键入一个字母需要一秒钟才能显示出来。
如何优化它?我应该在每 3 个 KeyUp 上匹配吗?我应该完全放弃 KeyUp 并每隔几秒钟自动匹配一次吗?
【问题讨论】:
-
rules何时更改?它们可以合并成一个单一的正则表达式吗?如果没有,您可以在 KeyUp 上启动一个计时器,等待 300 毫秒,然后 然后 进行正则表达式测试。这将防止用户做得太快。匹配规则时会发生什么?这个活动可以延期吗? -
除了只编译一次表达式(规则)之外,如果您使用单个表达式而不是 ~12 会有所帮助。如果您不更换,那么将它们组合起来很简单。您也可以尝试使用
(?>...)尽可能消除回溯。 -
正则表达式适用于回溯,因此您的输入越大延迟越大,您应该避免检查如此大的字符串,否则会影响您的代码停止响应。
-
你必须使用正则表达式吗?根据您查看的匹配类型,您自己的简单扫描仪可能会更快
-
Rob:你能详细说明一下吗?目前我实际上只匹配大量关键字,我只是假设正则表达式是最快的方法。
标签: c# regex windows-phone-8