Форматирование чисел в регулярных выражениях C #

#c# #regex

#c# #регулярное выражение

Вопрос:

Я не очень хорошо разбираюсь в регулярных выражениях и пытаюсь использовать их для форматирования чисел.

Исходное число будет чем-то вроде 05XX-123, и я хотел бы добавить нули, чтобы получилось 05XX-000123 (к числу после дефиса должны добавляться нули, пока его длина не станет равной шести). Если я смешаю регулярные выражения и строковые операции, я могу достичь этого с помощью следующего решения…

 Regex regex = Regex(@"^([0-9]{2})([A-Za-z]{2})-([0-9]*)$");
Match match = regex.Match("05XX-123");
string result = match.Groups[1].Value   match.Groups[2].Value   "-"   match.Groups[3].Value.PadLeft(6, '0');
  

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

Кажется, что нечто подобное этому должно быть возможно, но я просто не совсем уверен, как добавлять нули к третьей группе (число после букв).

 Regex regex = Regex(@"^([0-9]{2})([A-Za-z]{2})-([0-9]*)$");
string result = regex.Replace("05XX-123", "$1$2-$3");
  

Очевидно, что приведенный выше пример просто возвращает то же значение, что и было предоставлено, но, похоже, я должен быть в состоянии что-то сделать с группой $ 3, чтобы добавить нули, чтобы сделать длину $ 3 равной шести.

Буду признателен за любую помощь, спасибо!

Ответ №1:

Попробуйте это (если вам не нужно регулярное выражение для чего-то другого):

 string[] parts = originalNumber.Split(new char[] {'-'});
string newNumber = parts[0]   "-"   parts[1].PadLeft(6, '0');
  

Редактировать:

Другой вариант регулярных выражений:

 Regex regEx = new Regex(@"^([0-9]{2}[A-Z]{2}-)([0-9]*)$", RegexOptions.IgnoreCase);
string result = regEx.Replace("05XX-123",m => m.Groups[1].Value   m.Groups[2].Value.PadLeft(6, '0'));
  

Комментарии:

1. Это работает, хотя я бы хотел полностью избежать операций со строками. Причина в том, что я хотел бы, чтобы преобразование было определено во время выполнения.

2. @majorpayne27: создать шаблон регулярных выражений во время выполнения не намного проще, чем изменить параметры строковых функций IMO

3. Использование строковых функций, безусловно, было бы проще, но это не тот вариант, который доступен для меня. Мне нужно иметь возможность изменять формат вывода без перекомпиляции.

4. Я не уверен, возможно ли это без какого-либо обратного вызова (я не видел, чтобы это делалось без него) или выполнения нескольких проходов регулярных выражений. Я добавил другой метод выше, но если вы хотите, чтобы вывод был динамическим во время выполнения, сколько различных форматов вывода вы ожидаете поддерживать? Как они будут определены и выполнены?

5. 1, хотя, возможно, вы искали m => m.Groups[1].Value m.Groups[2].Value.PadLeft(6, '0')