2013-06-17 3 views
0

Это всего лишь вопрос из любопытства - я смотрел this question, и мне интересно, как вы могли бы сделать обе необходимые замены в одном Regex Replace.Regex Replace Within Замена

Таким образом, ситуация такова, что мы имеем следующий вход:

8.11.2012 16:15:10 
21.11.2012 15:00:54 
11.11.2012 0:24:24 
8.11.2012 16:06:53 
9.11.2012 0:49:37 

И хотите создать следующий вывод:

08_11_2012_16_15_10 
21_11_2012_15_00_54 
11_11_2012_00_24_24 
08_11_2012_16_06_53 
09_11_2012_00_49_37 

Другими словами:

  1. Replace любой одиночные цифры в строке времени/даты строки с «0» & Одиночный символ. Решение размещены прекрасно работает для этого: Заменить \b(\d)\b с 0$1
  2. Заменить разделитель с «_» И это было бы просто заменить [\s\:.] с _

Мой вопрос, есть ли какой-либо способ сделать ОБА замены в одном регулярном выражении, или если необходимо сделать 2 замены итераций?

Что это будет выглядеть?

Просто пытаясь узнать здесь - Спасибо!

Кроме того, даже если этот вопрос задан для Notepad ++, я использую .Net (C#/VB).

+1

Вы начинаете с 5 входов, но только 4 выхода. Это опечатка? Кажется, вы отсутствуете 09_11_2012_00_49_37 –

+3

FYI: Если это ваша конкретная потребность в .NET, вы можете сделать все это с помощью кода C#: 'DateTime.ParseExact (@" d \/M \/yyyy H \: mm \: ss ")' и 'DateTime.ToString (@" dd \ _MM \ _yyyy \ _HH \ _mm \ _ss ")' - а не регулярные выражения. –

+0

@Joe - На самом деле это действительно крутое решение, но это было больше вопросом о том, как сделать 2 регулярных выражения заменяемых в одном статусе, и это был только пример, который я имел под рукой ... Не останавливает ваше решение от будучи ДЕЙСТВИТЕЛЬНО хорошим, хотя !! –

ответ

2

Вам нужно будет сделать их как 2 отдельные замены.

Regex replace говорит, что найти этот матч & замените его на это значение. То, что вы замените, может включать ссылку на исходное совпадение, и, хотя вы могли бы найти сложный шаблон для соответствия &, замените обе вещи, это просто делает ваше выражение более сложным и менее вероятным для фактической работы.

1

Вам необходимо сделать 2 замены.

Проблема в том, что нет никакой условной замены-строки, и если вы хотите, чтобы появилось «0», «0» определенно должно быть частью вашей замены-строки.

Если вы имели только одну замену, а именно «_» (вместо «0» или «_» или оба) в результате: «_8_16_45__0_16_43», то есть будет способ сделать это :)

Мои 2 цента.

1

В C# вы можете сделать это в одной итерации с помощью делегата:

String result = Regex.Replace(input, @"(\d{1,2})\.(\d{1,2}).(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2})", 
    delegate(Match match) 
    { 
     string[] array = { match.Groups[1].Value.PadLeft(2, '0'), match.Groups[2].Value.PadLeft(2, '0'), match.Groups[3].Value.PadLeft(2, '0'), match.Groups[4].Value.PadLeft(2, '0'), match.Groups[5].Value.PadLeft(2, '0'), match.Groups[6].Value.PadLeft(2, '0')}; 
     return String.Join("_", array); 
    }); 

Чтобы разрешить различные сепараторы используют [\s\:.] вместо \.