2012-04-23 71 views
6

Tôi muốn để định dạng một chuỗi trông như thế nàyĐịnh dạng chuỗi với regex trong C#

BPT4SH9R0XJ6 

Into cái gì đó trông như thế này

BPT4-SH9R-0XJ6 

Chuỗi sẽ luôn là một kết hợp của 12 chữ và số

Bất cứ lời khuyên sẽ được đánh giá cao, nhờ

+6

Có một lý do bạn cần phải sử dụng một regex? – Justin

+0

Không thực sự, chỉ cần tìm đó là những gì thường được đề nghị –

+0

^^ đồng ý với @Justin. Điều này trông giống như một chuỗi con đơn giản. –

Trả lời

18

Hãy thử Regex.Replace(input, @"(\w{4})(\w{4})(\w{4})", @"$1-$2-$3");

Regex thường chế giễu, nhưng là một cách khá gọn gàng làm những gì bạn cần. Có thể được mở rộng đến các yêu cầu phức tạp hơn mà khó đáp ứng bằng cách sử dụng các phương thức chuỗi.

+0

Thats chính xác những gì tôi đang tìm kiếm, tôi biết điều này có thể được thực hiện với chất nền vv nhưng chuỗi nối thường phức tạp và không phải là rất thú vị để viết hoặc :) –

+0

là có một cách để nói $ 1.toLower() hoặc tương tự? – Zanidd

+0

@Zanidd Có, có một [overload of 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_) cho phép bạn sử dụng chức năng tùy chỉnh để tạo chuỗi thay thế. – Olly

5

Bạn có thể sử dụng "(.{4})(.{4})(.{4})" làm biểu hiện của bạn và "$1-$2-$3" làm hình thức thay thế của bạn. Đây là, tuy nhiên, hầu như không sử dụng tốt cho regexp: bạn có thể làm điều đó dễ dàng hơn nhiều với Substring.

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

Nó có vẻ như một sự kết hợp của String.Concatstring.Substring nên chăm sóc của tất cả mọi thứ mà bạn cần.

4

Nếu quy tắc là phải luôn luôn chia làm ba khối bốn nhân vật không cần thiết cho một exp reg:

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

Bất kỳ lý do nào bạn muốn thực hiện regex? bạn chỉ có thể chèn dấu gạch nối:

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

Điều này sẽ tiếp tục thêm dấu gạch nối mỗi 4 ký tự, sẽ không bị lỗi nếu chuỗi quá ngắn/dài/v.v.

+0

Bạn có chắc là mã đúng không? Bạn không sử dụng biến i. Ngoài ra nó không phải là rất hiệu quả vì nó tạo ra đối tượng chuỗi mới trong mỗi lần lặp. –

+0

@tomp, bạn nói đúng, tôi đặt 1 thay vì tôi – naspinski

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

Đã kết thúc upp sử dụng này

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); 

Cảm ơn

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

Nếu bạn được đảm bảo nội dung bạn đang hoạt động trên là mã 12 nhân vật thì tại sao bạn không chỉ cần sử dụng chuỗi con? Tại sao bạn cần Regex?

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

này làm việc với bất kỳ khoảng thời chuỗi:

  for (int i = 0; i < (int)Math.Floor((myString.Length - 1)/4d); i++) 
      { 
       myString = myString.Insert((i + 1) * 4 + i, "-"); 
      } 
Các vấn đề liên quan