Почему бы просто не использовать string.Replace
и убедитесь, что вы сначала заменить более конкретное значение
output = output.Replace("*keyOpenEnd", "\":").Replace("*key", "{\"");
EDIT
Вот тестовый код для сравнения регулярного времени выражения по сравнению с string.Replace
и моими результатами
string s = "*keyName:branding-SLES Relocations:(not relocatable)*keyOpenEnd";
string desired = "{\"Name:branding-SLES Relocations:(not relocatable)\":";
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 100000; i++)
{
var n = Regex.Replace(s, @"\*keyOpenEnd", "\":");
n = Regex.Replace(n, @"\*key", "{\"");
Assert.AreEqual(desired, n);
}
watch.Stop();
Console.WriteLine("RegEx Total: {0}", watch.Elapsed);
watch.Reset();
watch.Start();
for (int i = 0; i < 100000; i++)
{
var n = s.Replace("*keyOpenEnd", "\":").Replace("*key", "{\"");
Assert.AreEqual(desired, n);
}
watch.Stop();
Console.WriteLine("String Replace Total: {0}", watch.Elapsed);
Результаты:
RegEx Total: 00:00:00.1742555
String Replace Total: 00:00:00.0385957
Дополнительных Редактировать
Если вы используете один регулярный выражение и скомпилировать его для использования, string.Replace
еще быстрее
string s = "*keyName:branding-SLES Relocations:(not relocatable)*keyOpenEnd";
string desired = "{\"Name:branding-SLES Relocations:(not relocatable)\":";
Regex r = new Regex(@"\*key(.*)\*keyOpenEnd", RegexOptions.Compiled);
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 100000; i++)
{
var n = r.Replace(s, "{\"$1\":");
Assert.AreEqual(desired, n);
}
watch.Stop();
Console.WriteLine("RegEx Total: {0}", watch.Elapsed);
watch.Reset();
watch.Start();
for (int i = 0; i < 100000; i++)
{
var n = s.Replace("*keyOpenEnd", "\":").Replace("*key", "{\"");
Assert.AreEqual(desired, n);
}
watch.Stop();
Console.WriteLine("String Replace Total: {0}", watch.Elapsed);
Результат:
RegEx Total: 00:00:00.0960996
String Replace Total: 00:00:00.0393491
Вы, кажется, не имеют какой-либо разделитель после '* key' либо в начале или в конце (когда оно начало '* keyOpenEnd'). Поэтому я не думаю, что у вас есть выбор, кроме как заменить более длинную (менее двусмысленную) последовательность, а затем на более короткую двусмысленную. В этом конкретном случае, однако, я думаю, что ваш второй '\ b' является проблемой - в вашем первом регулярном выражении' \ bkey \ b' не будет соответствовать 'keyName'. – AAT
Зачем нужен разделитель, когда я знаю, что фраза «ключ» и «ключOpenEnd»? Могу ли я просто сказать «заменить» ключ с помощью X И keyOpenEnd с Y способом, который не заменяет ключ в keyOpenEnd с помощью X ?? – Fearghal
Ну, вы можете сделать это, если у вас всегда есть их в этой последовательности - тогда вы можете сделать это одним регулярным выражением. Это так?Об этом вы не очень поняли. – AAT