正则表达式工作非常慢

时间:2015-10-16 05:50:37

标签: c++ regex qt visual-studio-2015

我有很多小于64 kb的文件,我需要使用下面的代码转换它们。

以下是QT中使用QRegExp的工作代码。

我尝试使用regex_replace在MSVC中重写它,并面临工作速度非常慢的问题。

QT:

temp.replace(QRegExp("[ ]{0,}(=)[ ]{0,}"), QString("="));
temp.replace(QRegExp("[ ]{0,}(==)[ ]{0,}"), QString("=="));
temp.replace(QRegExp("[ ]{0,}(>)[ ]{0,}"), QString(">"));
temp.replace(QRegExp("[ ]{0,}(<)[ ]{0,}"), QString("<"));
temp.replace(QRegExp("[ ]{0,}(\\&\\&)[ ]{0,}"), QString("&&"));
temp.replace(QRegExp("[ ]{0,}(\\|\\|)[ ]{0,}"), QString("||"));
temp.replace(QRegExp("[ ]{0,}(\\})[ ]{0,}"), QString("}"));
temp.replace(QRegExp("[ ]{0,}(\\{)[ ]{0,}"), QString("{"));

MSVC:

temp = regex_replace(temp, std::regex("[ ]{0,}(=)[ ]{0,}"), "=");
temp = regex_replace(temp, std::regex("[ ]{0,}(==)[ ]{0,}"), "==");
temp = regex_replace(temp, std::regex("[ ]{0,}(>)[ ]{0,}"), ">");
temp = regex_replace(temp, std::regex("[ ]{0,}(<)[ ]{0,}"),"<" );
temp = regex_replace(temp, std::regex("[ ]{0,}(\\&\\&)[ ]{0,}"),"&&" );
temp = regex_replace(temp, std::regex("[ ]{0,}(\\|\\|)[ ]{0,}"),"||" );
temp = regex_replace(temp, std::regex("[ ]{0,}(\\})[ ]{0,}"), "}");
temp = regex_replace(temp, std::regex("[ ]{0,}(\\{)[ ]{0,}"),"{" );

例如:std::string temp(大小约为18kb)每行处理约10秒。

这里可能有什么问题?

1 个答案:

答案 0 :(得分:4)

可用的using System; using System.Data; using System.Linq; using System.Windows.Forms; namespace Samples { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var form = new Form(); var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form }; var data = GetData(); dg.DataSource = data; var updateTimer = new Timer { Interval = 200, Enabled = true }; updateTimer.Tick += (sender, e) => { foreach (var dr in GetData().AsEnumerable()) data.LoadDataRow(dr.ItemArray, LoadOption.OverwriteChanges); }; Application.Run(form); } static DataTable GetData() { var dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name"); dt.Columns.Add("Score", typeof(int)); dt.PrimaryKey = new[] { dt.Columns["Id"] }; var random = new Random(); for (int i = 1; i <= 1000; i++) dt.Rows.Add(i, "Player #" + i, random.Next(1, 100000)); return dt; } } } 实现不是抢夺(但是?),但std::regex速度相当快。