2013-03-07 54 views
9

Tôi mới bắt đầu sử dụng Regular Expressions và điều này quá áp đảo đến mức ngay cả sau khi đọc tài liệu tôi dường như không tìm được nơi để bắt đầu trợ giúp với sự cố của mình.Ký tự đại diện thường xuyên

Tôi có một loạt các chuỗi.

"Project1 - Notepad" 
"Project2 - Notepad" 
"Project3 - Notepad" 
"Untitled - Notepad" 
"HeyHo - Notepad" 

Và tôi có một chuỗi chứa thẻ hoang dã.

"* - Notepad" 

Tôi cần rằng nếu so sánh bất kỳ chuỗi nào trong số này với ký tự chứa ký tự đại diện, giá trị đó trả về true. (Với Regex.IsMatch() hoặc một cái gì đó tương tự ..)

Tôi thường không hỏi câu trả lời như thế nhưng tôi không thể tìm thấy những gì tôi cần. Ai đó có thể chỉ cho tôi ra đúng hướng không?

+0

Chuỗi bạn muốn "so sánh" có phải là chuỗi tĩnh, người dùng nhập, v.v ... không? Nói cách khác, nó sẽ luôn luôn là '* - Notepad' (hoặc tương tự), hoặc nó có thể được sửa đổi trong thời gian chạy không? – newfurniturey

+0

ký tự đại diện sẽ là '. *' ('.' là bất kỳ thứ gì và' * 'đang lặp lại 0 hoặc nhiều lần) – Default

+0

Nó sẽ là chuỗi được người dùng nhập vào. Nó có thể so sánh Project1 - Notepad với Project1 - Notepad. Nhưng người dùng sẽ có sự lựa chọn để bao gồm tất cả các dự án Notepad với một ký tự đại diện – phadaphunk

Trả lời

13

Các ký tự đại diện * tương đương với mô hình Regex ".*" (tham lam) hoặc ".*?" (không tham lam), vì vậy bạn sẽ muốn thực hiện một Sửa string.Replace() đầu tiên

string pattern = inputPattern.Replace("*", ".*?"); 
Regex regex = new Regex(pattern); 

:

Hãy nhớ rằng nếu inputPattern chứa bất kỳ ký tự đặc biệt nào được sử dụng bởi Regex, mẫu của bạn sẽ phát nổ.

Regex.IsMatch(input, ".NET"); // may match ".NET", "aNET", "?NET", "*NET" and many more 

Vì vậy, bạn sẽ muốn giữ một mắt ra cho họ (đặt một \ trước đó, chẳng hạn như . ->\.)

MSDN: Regex quick reference

+0

Vì vậy, trong trường hợp này mẫu chuỗi sẽ là * - Notepad? – phadaphunk

+0

@PhaDaPhunk Giả sử 'inputPattern' là" * - Notepad ",' chuỗi mẫu' sẽ là ". *? - Notepad". Tuy nhiên, hãy nhớ rằng nếu 'myString' chứa các ký tự đặc biệt khác được Regex nhận dạng, chẳng hạn như'. [()] \ * +? 'mô hình của bạn sẽ khá lộn xộn. – Nolonar

+0

Nếu tôi ** có ** sử dụng các ký tự này như "?" hoặc là "." có cách nào không? – phadaphunk

1

Có vẻ như mô hình mà bạn muốn như sau:

/^.+-\s*Notepad$/ 

Mẫu này sẽ khớp với toàn bộ chuỗi nếu kết thúc bằng "- Notepad".

+0

Tuyệt vời. Cảm ơn câu trả lời. Đây là chính xác regex cần thiết mà không cần tất cả những giải thích thêm – AlbatrossCafe

5

tôi chỉ viết này một cách nhanh chóng (dựa tắt của Validate that a string contain some exact words)

static void Main() 
    { 
     string[] inputs = 
     { 
      "Project1 - Notepad", // True 
      "Project2 - Notepad", // True 
      "HeyHo - Notepad", // True 
      "Nope - Won't work" // False 
     }; 

     const string filterParam = "Notepad"; 
     var pattern = string.Format(@"^(?=.*\b - {0}\b).+$", filterParam); 

     foreach (var input in inputs) 
     { 
      Console.WriteLine(Regex.IsMatch(input, pattern)); 
     } 
     Console.ReadLine(); 
    } 
+0

Hoạt động tuyệt vời! Chỉ có điều là kể từ khi Notepad sẽ được biến, sử dụng một cái gì đó như thế này: @ "^ (? =. * \ B -" + variableContainingNotepad + "\ b). + $" Để thay đổi từ Notepad dường như không hoạt động vì các ký tự "+" – phadaphunk

+0

sử dụng string.Format, tôi sẽ cập nhật bài đăng đầu tiên của mình. –

3

Bạn nên làm như thế này:

string myPattern = "* - Notepad"; 
foreach(string currentString in myListOfString) 
    if(Regex.IsMatch(currentString, myPattern, RegexOptions.Singleline){ 
     Console.WriteLine("Found : "+currentString); 
    } 
} 

Bằng cách này tôi thấy bạn đến từ Montreal, tài liệu tiếng Pháp thêm + hữu ích công cụ: http://www.olivettom.com/?p=84

Chúc may mắn!

Các vấn đề liên quan