2012-04-23 2 views
6

Я хотел бы форматировать строку, которая выглядит как этотформатной строки с регулярным выражением в C#

BPT4SH9R0XJ6 

В то, что выглядит как этот

BPT4-SH9R-0XJ6 

Строка всегда будет смесь из 12 букв и номер

Любые советы будут высоко оценены, спасибо

+6

Есть ли причина, что вам нужно использовать регулярное выражение? – Justin

+0

Не совсем, просто подумал, что это то, что обычно рекомендуется –

+0

^^ согласен с @Justin. Это выглядит как простая подстрока. –

ответ

18

Попробуйте Regex.Replace(input, @"(\w{4})(\w{4})(\w{4})", @"$1-$2-$3");

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

+0

Thats именно то, что я искал, я знаю, что это можно сделать с помощью substr и т. Д., Но конкатенация строк часто становится сложной и не очень приятно писать :) :) –

+0

есть способ сказать $ 1.toLower() или похожие? – Zanidd

+0

@ Zanidd Да, есть [перегрузка Replace()] (https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.replace?view=netframework-4.7.1 #System_Text_RegularExpressions_Regex_Replace_System_String_System_String_System_Text_RegularExpressions_MatchEvaluator_), который позволяет вам использовать пользовательскую функцию для генерации сменной строки. – Olly

5

Вы можете использовать "(.{4})(.{4})(.{4})" как ваше выражение и "$1-$2-$3" в качестве вашей замены. Это, однако, вряд ли полезно использовать для регулярного выражения: вы можете сделать это намного проще с Substring.

var res = s.Substring(0,4)+"-"+s.Substring(4,4)+"-"+s.Substring(8); 
3

Казалось бы, что сочетание String.Concat и string.Substring должны заботиться обо всем, что вам нужно.

4

Если правило всегда разделен на три блока из четырех символов, нет необходимости в Изотерм ехр:

str.Substring(0,4) + "-" + str.Substring(4,4) + "-" + str.Substring(8,4) 
+0

Whops - thanks @dasblinkenlight – MiMo

2
var str = "BPT4SH9R0XJ6"; 
    var newStr = str.Substring(0, 4) + "-" + str.Substring(4, 4) + "-" + str.Substring(8, 4); 
1

Любая причина, по которой вы хотите сделать регулярное выражение? вы можете просто вставить дефис:

string s = "BPT4SH9R0XJ6"; 
for(int i = 4; i < s.length; i = i+5) 
    s = s.Insert(i, "-"); 

Это будет держать добавив дефис каждые 4-х символов, не без ошибок, если строка была слишком короткой/длинной/и т.д..

+0

Вы уверены, что код верен? Вы не используете переменную i. Также он не очень эффективен, так как он создает новый строковый объект на каждой итерации. –

+0

@tomp, вы правы, я положил 1 вместо i – naspinski

1
return original_string.SubString(0,4)+"-"+original_string.SubString(4,4)+"-"+original_string.SubString(8,4); 
0

Закончен УПП, используя этот

var original = "BPT4SH9R0XJ6".ToCharArray(); 

var first = new string(original, 0, 4); 
var second = new string(original, 4, 4); 
var third = new string(original, 8, 4); 
var mystring = string.Concat(first, "-", second, "-", third); 

Благодарности

1
string str = @"BPT4SH9R0XJ6"; 
string formattedString = string.Format("{0}-{1}-{2}", str.Substring(0, 4), str.Substring(4,4), str.Substring(8,4)); 
0

Если вы гарантированно текст вы действуете на это код 12 символов, то почему бы вам не просто использовать подстрока? Зачем вам Regex?

String theString = "AB12CD34EF56"; 
String theNewString = theString.Substring(0, 4) + "-" + theString.Substring(4, 4) + "-" + theString.Substring(8, 4);' 
1

Это работает с любой длиной строки:

  for (int i = 0; i < (int)Math.Floor((myString.Length - 1)/4d); i++) 
      { 
       myString = myString.Insert((i + 1) * 4 + i, "-"); 
      } 
Смежные вопросы