2013-03-07 10 views
9

Właśnie zacząłem używać Regular Expressions i to jest tak przytłaczające, że nawet po przeczytaniu dokumentacji nie mogę znaleźć, gdzie zacząć pomagać w moim problemie.Zwykłe wyrażenie wieloznaczne

Mam kilka strun.

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

I mam ciąg zawierający dziką kartę.

"* - Notepad" 

musiałbym że jeśli porównać każdy z tych ciągów z jednego zawierającego wieloznaczny zwraca prawda. (Z Regex.IsMatch() lub coś podobnego ..)

Zazwyczaj nie pytam o odpowiedzi, ale po prostu nie mogę znaleźć tego, czego potrzebuję. Czy ktoś może wskazać mi właściwy kierunek?

+0

Czy ciąg, który chcesz "porównać z" będzie ciągiem statycznym, danymi wprowadzanymi przez użytkownika itp.? Innymi słowy, czy zawsze będzie to "* - Notepad" (lub podobne), czy może być modyfikowane w czasie wykonywania? – newfurniturey

+0

symbol wieloznaczny to ". *" ("." Jest dowolne, a '*' jest powtarzane zero lub więcej razy) – Default

+0

Będzie to ciąg wejściowy użytkownika. Można porównać Project1 - Notepad z Project1 - Notepad. Ale użytkownik może wybrać wszystkie projekty Notatnika z symbolem wieloznacznym. – phadaphunk

Odpowiedz

13

symbolu wieloznacznego * jest odpowiednikiem wzoru Regex ".*" (chciwy) lub ".*?" (nie-chciwy), więc będziemy chcieli przeprowadzić string.Replace() pierwszy

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

EDIT:

Należy pamiętać, że jeśli inputPattern zawiera dowolny znak specjalny używany przez Regex, twój wzór powinien eksplodować.

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

więc będziemy chcieli, aby mieć oko na nich (umieścić \ przed tym, jak . ->\.)

MSDN: Regex quick reference

+0

Więc w tym przypadku wzór ciągu znaków byłby * - Notatnik? – phadaphunk

+0

@PhaDaPhunk Zakładając, że "inputPattern" to "* - Notepad", "string pattern" będzie ". *? - Notepad". Pamiętaj jednak, że jeśli 'myString' zawiera inne znaki specjalne rozpoznawane przez Regex, takie jak'. [()] \ * +? "Twój wzór będzie dość pomieszany. – Nolonar

+0

Co jeślibym ** miał ** używać takich znaków jak "?" lub "." czy jest jakiś sposób obejścia? – phadaphunk

1

Wydaje się wzór, który chcesz jest następujące:

/^.+-\s*Notepad$/ 

Ten wzór dopasuje cały ciąg, jeśli kończy się na "- Notatnik".

+0

Awesome. Dziękuję za odpowiedź. Jest to dokładne wyrażenie potrzebne bez tych dodatkowych wyjaśnień. – AlbatrossCafe

5

Właśnie napisałem to szybko (w oparciu off 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

Działa świetnie! Jedyną rzeczą jest to, że Notatnik będzie zmienny, używając czegoś takiego: @ "^ (? =. * \ B -" + variableContainingNotepad + "\ b). + $", Aby zmienić słowo Notatnik nie działa z powodu "+" znaków – phadaphunk

+0

użyć ciągu.Format, będę aktualizować mój pierwszy post. –

3

Powinieneś zrobić tak:

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

Nawiasem mówiąc widziałem przyszedł z Montrealu, dodatkowej dokumentacji french + usefull narzędzie: http://www.olivettom.com/?p=84

Powodzenia!