2016-07-28 9 views
1

Dies ist in C#. Ich habe meinen Kopf abgefangen, aber bisher kein Glück.Regex, das die 2 nachfolgenden Buchstaben aus einer Zeichenfolge entfernt, die nicht mit anderen Buchstaben vorangestellt ist

So zum Beispiel

123456BVC --> 123456BVC (keep the same) 
123456BV --> 123456 (remove trailing letters) 
12345V -- > 12345V (keep the same) 
12345 --> 12345 (keep the same) 
ABC123AB --> ABC123 (remove trailing letters) 

Es kann mit etwas beginnen.

Ich habe versucht, @".*[a-zA-Z]{2}$" aber kein Glück

Dies ist in C#, so dass ich immer eine Zeichenfolge zurück, die beide hinteren Buchstaben zu entfernen, wenn sie existieren und nicht mit einem anderen Brief voraus.

Match result = Regex.Match(mystring, pattern); 
return result.Value; 
+0

Was soll der Ausgang für "AB" sein? – dotctor

+0

@dotctor: Das scheint irrelevant zu sein, da die Stringlänge mit 'mystring.Length' überprüft werden kann, bevor eine Regex ausgeführt wird. –

Antwort

0

Ihr @".*[a-zA-Z]{2}$" Regex paßt alle 0+ anderen Zeichen als eine neue Zeile (so viele wie möglich) und 2 ASCII-Buchstaben am Ende des Strings. Sie überprüfen nicht den Kontext, so dass die 2 Buchstaben übereinstimmen, unabhängig davon, was ihnen vorangeht.

Sie benötigen einen regulären Ausdruck, der die letzten beiden Buchstaben nicht voran mit einem Buchstaben übereinstimmen:

(?<!\p{L})\p{L}{2}$ 

this regex demo See.

Einzelheiten:

  • (?<!\p{L}) - nicht das Spiel, wenn ein Brief (\p{L}) vor der aktuellen Position gefunden wird (Sie [a-zA-Z] verwenden können, wenn Sie nur mit ASCII-Buchstaben beschäftigen möchten)
  • \p{L}{2} - 2 Buchstaben
  • $ - Ende der Zeichenfolge.

In C# verwenden

var result = Regex.Replace(mystring, @"(?<!\p{L})\p{L}{2}$", string.Empty); 
+1

Eine Aufschlüsselung der Ausdruck wäre gut, anstatt nur eine Löffel gefüttert Antwort auf eine Frage, die so spezifisch ist, dass es wahrscheinlich niemandem von Nutzen sein wird –

+1

Keine Ahnung, was Sie mit einem Löffel gefüttert Antwort bedeuten , OP stellte ein regex OP zur Verfügung. Ich füge 100% meiner Antworten zu, siehe meine Antworten im Profil. –

+1

@Wiktor Stribiżew Danke! wirkt wie ein Charme. Testfälle: "132456AC", ExpectedResult = "132456") "132456ACV", ExpectedResult = "132456ACV") "ABC2D2DD", ExpectedResult = "ABC2D2") "123456", ExpectedResult = "123456") "1234AB" , ExpectedResult = "1234") "1234A", ExpectedResult = "1234A") – exevio

0

Wenn Sie die letzten beiden Buchstaben zu entfernen suchen, Sie dies einfach tun können:

string result = Regex.Replace(originalString, @"[A-Za-z]{2}$", string.Empty); 

Denken Sie daran, dass das Ende in regex $ bedeutet der Eingabe oder die Zeichenfolge vor einem Zeilenumbruch.

+0

Noch einmal, dieses '[A-Za-z] {2} $' berücksichtigt nicht, was vor den letzten 2 Buchstaben steht.Wie für * oder die Zeichenfolge vor einem Newline * - nicht in Ihrem Fall, da Sie nicht das Flag "RegexOptions.Multiline" verwenden. –

+0

Es muss nicht auf der Frage basieren, wie ich es verstehe. @exevio möchte nur die letzten zwei Zeichen der Zeichenfolge entfernen, wenn sie Buchstaben sind. Keine Notwendigkeit, mit dem zu tun, was nicht passt, da wir nichts davon ersetzen, und es ändert sich nicht, ob die letzten 2 Buchstaben sind oder nicht, es sei denn, ich lese etwas komplett falsch. –

+0

Siehe * 123456BVC -> 123456BVC (behalten Sie das gleiche) *. [Deine Regex] (https://regex101.com/r/cZ8yK2/1) behält nicht das Gleiche *. –

Verwandte Themen