2010-12-15 14 views
1

Ich habe ein gutes Stück Regex Wissen, aber ich bin von diesem ratlos. Ich brauche eine Regex, die alles entspricht vor der letzte Unterstrich, aber nur wenn der Text nach dem Unterstrich ist "selbst", "Verbündeter" oder "Feind".Regex, die alles vor einem Unterstrich

Also, wenn ich Eingabezeichenfolgen wie dieses:

"hero_anti_infantry_melee_2_self" 
"anti_infantry_ranged_2_ally" 
"suppression_aoe_enemy" 
"reinforce_btn_down" 
"inset_energy" 
"suppressed" 

Ich möchte, dass sie die Ausgabe wie:

"hero_anti_infantry_melee_2" 
"anti_infantry_ranged_2" 
"suppression_aoe" 
//No Match (not match because it isn't enemy, ally, or self after the underscore) 
//No Match 
//No Match (not underscores or enemy/ally/self 

Dies ist die C# Regex-Engine, und es können alle Regex-Optionen verwendet, falls nötig . Ich werde eine akzeptierte Antwort und eine Verbesserung geben, wenn es funktioniert.

Bearbeiten: Aktualisierter Titel.

Edit 2: Feste Beispiele.

Antwort

5

Was Sie wollen, ist ein Lookahead. So etwas sollte funktionieren:

new Regex(@"^.*(?=_(ally|self|enemy)$)") 

Die (?= ... ) bedeutet pretty much what you wanted:

Null-Breite positive Vorschau. Entspricht einer Position, an der das Muster im Lookahead übereinstimmen kann. Stimmt nur mit der Position überein. Es verbraucht keine Zeichen oder erweitert die Übereinstimmung. In einem Muster wie eins (? = Zwei) drei müssen sowohl zwei als auch drei an der Position übereinstimmen, an der die Übereinstimmung von Eins endet.

bearbeiten: MSDN better examples für diese hat.

+0

Auch realisierte ich die falschen Beispiele. Ich bin mir nicht sicher, ob das funktioniert oder nicht, da dieser Regex nicht zu funktionieren scheint. – Miguel

+0

Ich hatte einen Tippfehler in der Regex - ') $' anstelle von '$)'. Ich habe es auch in C# -Syntax geändert - und tatsächlich überprüft, dass es diesmal funktioniert. – configurator

+0

Funktioniert perfekt. Und ich denke, dass die Verwendung eines Lookahead am sinnvollsten ist.+1 – Miguel

1

/(.+)_(ally|self|enemy)/

+0

Ich habe es getestet, und es sieht aus wie das Muster der \ Verbündeten \ selbst nach dem Unterstrich Feind enthält. Ich würde es eher dem letzten Unterstrich anpassen, aber nur wenn die Buchstaben danach feindlich sind (siehe die ersten 3 Beispiele). Auch für was sind die Schrägstriche vorher und nachher? – Miguel

+0

Das ist PHP/Perl-Syntax, Sie wollen nur die erste Erfassung des Spiels für Ihre Zwecke untersuchen. (. + _) (Verbündeter | Selbst | Feind) –

1

Diese Methode Sie geben das gewünschte Ergebnis. Dies verwendet die benannte Gruppenregex-Übereinstimmung.

private static string GetStringBeforeUnderscore(string input) 
{ 
    string matchedValue = 
     Regex.Match(input, "(?<Group>.*)[_](self|ally|enemy)").Groups["Group"].ToString(); 

    return matchedValue; 
} 
0

Ich kann noch nicht auf die andere Antwort Kommentar von Macy Abbey, so geht es hier:

Wenn Sie nur das Wort am Ende passen wollen Sie eine „$“ anhängen an Das Ende der Suchzeichenfolge:

/(.+)_(ally|self|enemy)$/ 
+0

Ah, habe gerade gemerkt, dass mein Titel komplett falsch ist ... – Miguel

0

Dies funktioniert

static void Main(string[] args) 
     { 
      string [] vars= 
     new string[]{ @"data\ui\textures\generic\decorators\hero_anti_infantry_melee_2_self", 
@"data\ui\textures\generic\decorators\anti_infantry_ranged_2_ally", 
@"data\ui\textures\generic\decorators\suppression_aoe_enemy", 
@"data\ui\textures\generic\decorators\reinforce_btn_down", 
@"data\ui\textures\generic\decorators\rinset_energy", 
@"data\ui\textures\generic\decorators\suppressed" }; 

Regex re = new Regex("^(.*)_(ally|self|enemy)"); 

var xx= vars.Select(x => re.Match(x).Groups[1]); 
foreach (var y in xx) 
    Console.WriteLine(y.Value.ToString()); 
     } 
    } 
+0

Es funktioniert ohne Zweifel, aber in diesem Fall brauche ich einfach die erste Übereinstimmung, um das Ergebnis zu erreichen, unabhängig von der Gruppierung. – Miguel

Verwandte Themen