C # Regex cho hướng dẫn


122

Tôi cần phân tích cú pháp qua một chuỗi và thêm các dấu ngoặc kép xung quanh mỗi giá trị Hướng dẫn. Tôi đã nghĩ rằng tôi có thể sử dụng Regex để làm điều này nhưng tôi không chính xác là một chuyên gia Regex.

Có Regex tốt để sử dụng để xác định Hướng dẫn không?

Câu hỏi thứ hai của tôi là khi tôi đã tìm thấy một regex hợp lệ, tôi cho rằng tôi sẽ sử dụng Regex.Replace(String, String, MatchEvaluator)nhưng tôi không chắc về cú pháp. Có thể một cái gì đó như:

return Regex.Replace(stringToFindMatch, GuidRegex, match =>
{
    return string.Format("'{0}'", match.Groups[0].ToString());
});

Một chuỗi mà tôi đang cố gắng phân tích cú pháp có thể trông như thế này:

"CHỌN passwordco0_.PASSWORD_CONFIG_ID làm PASSWORD1_46_0_, FROM PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170c040677-a13-ac3e170c0406-a1-ac3e170c0406-3f1: 3f3-hướng dẫn:


5
Đó là SQL và bạn nên sử dụng các tham số SQL.
jrummell

2
Tại sao bạn sẽ sử dụng regex có một GUID.IsGUid
Micah Armantrout

Trên thực tế, có một tham số, nhưng nó giống với giá trị trong mệnh đề where. Điều này đến từ đâu? Một hồ sơ?
jrummell

@jrummell Đây là từ một hồ sơ đúng vậy. Tôi đang cố gắng chuyển đổi đầu ra để tôi có thể sao chép và dán nó và chạy nó trong SQL Management Studio. Điều này chỉ dành cho mục đích ghi nhật ký. Nó sẽ vẫn được chạy dưới dạng sql được tham số hóa.
Cole W

Câu trả lời:


182

Điều này khá đơn giản và không yêu cầu một đại biểu như bạn nói.

resultString = Regex.Replace(subjectString, 
     @"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$", 
     "'$0'");

Điều này phù hợp với các kiểu sau, là tất cả các định dạng tương đương và được chấp nhận cho GUID.

ca761232ed4211cebacd00aa0057b223
CA761232-ED42-11CE-BACD-00AA0057B223
{CA761232-ED42-11CE-BACD-00AA0057B223}
(CA761232-ED42-11CE-BACD-00AA0057B223)

Cập nhật 1

@NonStatic đưa ra quan điểm trong các nhận xét rằng regex ở trên sẽ khớp với các kết quả xác thực sai có dấu phân cách đóng sai.

Điều này có thể tránh được bằng các điều kiện regex được hỗ trợ rộng rãi.

Các điều kiện được hỗ trợ bởi JGsoft engine, Perl, PCRE, Python và .NET framework. Ruby hỗ trợ chúng bắt đầu từ phiên bản 2.0. Các ngôn ngữ như Delphi, PHP và R có các tính năng regex dựa trên PCRE cũng hỗ trợ các điều kiện. (nguồn http://www.regular-expressions.info/conditional.html )

Regex theo sau Sẽ khớp

{123}
(123)
123

Và sẽ không khớp

{123)
(123}
{123
(123
123}
123)

Regex:

^({)?(\()?\d+(?(1)})(?(2)\))$

Các giải pháp được đơn giản hóa để chỉ khớp với các số để hiển thị một cách rõ ràng hơn những gì được yêu cầu nếu cần.


Như đã viết, điều này sẽ không hoạt động đối với tất cả các loại GUID hợp lệ (do đó là bản cập nhật).
senfo

4
Điều này không tính đến các ký tự viết thường mà sẽ là một trường hợp hợp lệ. Sử dụng ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ hoặc sử dụng cờ / i
Michael Brown

@MichaelBrown Nó không phân biệt chữ hoa chữ thường, xem RegexOptions.IgnoreCase trong mẫu mã.
buckley

1
Regex cũng sẽ cho phép ít hơn 4 dấu trừ. Fyi cho những ai quan tâm đến điều này. Đối với những người không quan tâm, đây là một regex đơn giản cho phép nhiều dương tính giả hơn: [0-9a-fA-F\-]{32,36}.
usr

1
Không hoạt động chohttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic

40

Hầu hết các regex cơ bản là sau:

(^([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$) 

hoặc bạn có thể dán nó vào đây .

Hy vọng điều này giúp bạn tiết kiệm thời gian.


Không hoàn toàn đầy đủ như câu trả lời được đề xuất, nhưng +1 cho liên kết regex101.com.
Jim Billig

4
Loại bỏ sự lặp lại: [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}Các dấu gạch ngang có thể được thực hiện tùy chọn: [0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}.
Louis Somers vào

17

Đối với C # .Net để tìm và thay thế bất kỳ chuỗi tìm kiếm hướng dẫn nào từ văn bản đã cho,

Sử dụng RegEx này:

[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?

Mã C # mẫu:

var result = Regex.Replace(
      source, 
      @"[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?", 
      @"${ __UUID}", 
      RegexOptions.IgnoreCase
);

Chắc chắn là hiệu quả! Và nó khớp & thay thế các kiểu sau, tất cả đều là các định dạng tương đương và được chấp nhận cho GUID.

"aa761232bd4211cfaacd00aa0057b243" 
"AA761232-BD42-11CF-AACD-00AA0057B243" 
"{AA761232-BD42-11CF-AACD-00AA0057B243}" 
"(AA761232-BD42-11CF-AACD-00AA0057B243)" 

4
Câu trả lời được chấp nhận không phù hợp với tôi nhưng câu trả lời này thì có!
Merin Nakarmi

Một vấn đề ở đây. Hướng dẫn sẽ chỉ chứa các số thập lục phân. Vì vậy, các chữ cái từ az và AZ không được chấp nhận mà chỉ có af và AF. Nếu không, nó sẽ chấp nhận bất kỳ văn bản nào có 32 ký tự là Hướng dẫn hợp lệ.
Merin Nakarmi

Ditto - Câu trả lời được chấp nhận không phù hợp với tôi nhưng câu trả lời này thì có!
Greg Trevellick

8

Trong .NET Framework 4 có cấu trúc System.Guid nâng cao, chúng bao gồm các phương thức TryParse và TryParseExact mới để phân tích cú pháp GUID. Đây là ví dụ cho điều này.

    //Generate New GUID
    Guid objGuid = Guid.NewGuid();
    //Take invalid guid format
    string strGUID = "aaa-a-a-a-a";

    Guid newGuid;

    if (Guid.TryParse(objGuid.ToString(), out newGuid) == true)
    {
        Response.Write(string.Format("<br/>{0} is Valid GUID.", objGuid.ToString()));
    }
    else
    {
        Response.Write(string.Format("<br/>{0} is InValid GUID.", objGuid.ToString()));
    }


    Guid newTmpGuid;

    if (Guid.TryParse(strGUID, out newTmpGuid) == true)
    {
        Response.Write(string.Format("<br/>{0} is Valid GUID.", strGUID));
    }
    else
    {
        Response.Write(string.Format("<br/>{0} is InValid GUID.", strGUID));
    }

Trong ví dụ này, chúng tôi tạo đối tượng hướng dẫn mới và cũng lấy một biến chuỗi có hướng dẫn không hợp lệ. Sau đó, chúng tôi sử dụng phương thức TryParse để xác nhận rằng cả hai biến đều có định dạng hướng dẫn hợp lệ hay không. Bằng cách chạy ví dụ, bạn có thể thấy rằng biến chuỗi không có định dạng hướng dẫn hợp lệ và nó đưa ra thông báo "InValid hướng dẫn". Nếu biến chuỗi có hướng dẫn hợp lệ hơn giá trị này sẽ trả về true trong phương thức TryParse.


7
Câu hỏi đặt ra là làm thế nào để tìm / trích xuất một GUID từ một chuỗi dài hơn, không xác thực một GUID. Đề nghị bạn loại bỏ câu trả lời này.
Gone Coding

13
@Micah Armantrout: Nó có thể là một câu trả lời "tốt", nhưng nó không phải là câu trả lời cho câu hỏi này . Nếu bạn chỉ cần đặt bất kỳ câu trả lời bất cứ nơi nào mà bạn thích, nó loại đánh bại mục đích của StackOverflow :)
Đã qua rồi cái Mã hóa

8
Chà, đối với một người như tôi đang tìm kiếm "regex cho hướng dẫn", câu trả lời này thực sự hữu ích nhất - tôi thực sự không cần regex, tôi cần khớp với các GUID và trang này là kết quả đầu tiên cho "regex để phát hiện hướng dẫn "trên Google hiện tại.
Dan Field

3
Biệt phái @Dan Field. Tôi đến đây khi tìm kiếm regex cho hướng dẫn và tìm thấy câu trả lời này là những gì tôi thực sự muốn. Do đó, mục đích của StackOverflow đã được thực hiện.
JLScott

Đây không phải là câu trả lời có liên quan nhưng nó tất nhiên là hữu ích. Một phiếu bầu từ tôi. :)
Merin Nakarmi

8

Bạn có thể dễ dàng tự động tạo mã C # bằng cách sử dụng: http://regexhero.net/tester/ .

Nó miễn phí.

Đây là cách tôi đã làm điều đó:

nhập mô tả hình ảnh ở đây

Sau đó, trang web tự động tạo mã .NET:

string strRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"     {CD73FAD2-E226-4715-B6FA-14EDF0764162}.Debug|x64.ActiveCfg =         Debug|x64";
string strReplace = @"""$0""";

return myRegex.Replace(strTargetString, strReplace);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.