2014-10-15 3 views
0

У меня есть следующая строка.Как использовать регулярное выражение для замены точных фраз строкой

* KEYNAME: брендинг-SLES переезды: (не перемещаемый) * keyOpenEnd

Я хочу Repalce клавишу * с { "и * keyOpenEnd с": так у меня есть результат строки

{ "Имя: брендинг-SLES переезды: (не перемещаемый)":

Так я есть

output = Regex.Replace(output, @"\b"+"key"[email protected]"\b", "{\""); 
output = Regex.Replace(output, @"\b\*keyOpenEnd\b", "\":"); 

Я пробовал различные комбинации разностей, но ничего не работает.

Обновление: Кажется, это путаница по вопросу. уточнить; Мне нужно заменить точные фразы, иначе он заменит «Key» в KeyOpenEnd, а также Key, который не является хорошим. Мне нужна точная замена фразы.

+0

Вы, кажется, не имеют какой-либо разделитель после '* key' либо в начале или в конце (когда оно начало '* keyOpenEnd'). Поэтому я не думаю, что у вас есть выбор, кроме как заменить более длинную (менее двусмысленную) последовательность, а затем на более короткую двусмысленную. В этом конкретном случае, однако, я думаю, что ваш второй '\ b' является проблемой - в вашем первом регулярном выражении' \ bkey \ b' не будет соответствовать 'keyName'. – AAT

+0

Зачем нужен разделитель, когда я знаю, что фраза «ключ» и «ключOpenEnd»? Могу ли я просто сказать «заменить» ключ с помощью X И keyOpenEnd с Y способом, который не заменяет ключ в keyOpenEnd с помощью X ?? – Fearghal

+0

Ну, вы можете сделать это, если у вас всегда есть их в этой последовательности - тогда вы можете сделать это одним регулярным выражением. Это так?Об этом вы не очень поняли. – AAT

ответ

1

Почему бы просто не использовать 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 
+0

Не уверен, что это делает. Вы можете объяснить? – Fearghal

+0

См. Обновленный вопрос, добавлено разъяснение и желаемый пример строки – Fearghal

+0

Пробовал это, работает ли он, глядя на конкретный, прежде чем более общие условия поиска? Это кажется медленнее, чем регулярное выражение, но работает. Однако его неудобно, поскольку он действительно зависит от последовательности заменяющих терминов, и у меня есть несколько. – Fearghal

0

Попробуйте заменить ^\*key с {и \*keyOpenEnd$ с}

Отредактировано, если * это джокер, то сделайте следующее

заменить key(.*)keyOpenEnd с {"$1"

+0

Это все равно приведет к замене ключа * в обоих * ключах и * keyOpenEnd $ no? – Fearghal

+0

См. Обновленный вопрос, добавлено разъяснение и желаемый пример строки – Fearghal

+0

@Fearghal, так что * на самом деле означает некоторую строку вместо символа '*'? – Steve

Смежные вопросы