2016-04-19 22 views
0

Ich habe die folgende ZeichenfolgeRegex zu Gruppe Postleitzahl, Stadt und Staat

„98225-2077 Bellingham WA“

Ich brauche Regex zu verwenden, Postleitzahl, Stadt und Staat zu trennen. sollten die Gruppen (98225-2077) (Bellingham) und (WA) zurückgeben. Der Status ist optional und wird immer am Ende sein und wird aus zwei Großbuchstaben bestehen.

Ich bin in der Lage, die folgenden mit regex

Postleitzahl herauszufiltern: (^([\S]+-)?\d+(-\d+)?) - Gruppe [1]
Stadt: ((^([\S]+-)?\d+(-\d+)?)\s)?(\S.*) = Gruppe [5].

Kann es einen einzigen Regex geben, um alle drei mit der gleichen Regex auszufiltern und leer zu senden, falls der Status nicht vorhanden ist?

+1

Stadtname auch von mehr als ein Wort sein kann. Beispiel Neu-Delhi. – SJMan

+1

Toll ... Danke, dass du mir das jetzt erzählst –

+0

Die einzige Art zu analysieren ist Regex, die im Db nach dem Entwurf gespeichert wird – SJMan

Antwort

0

Ich würde für die Aufteilung der Zeichenfolge auf Platz und dann die verschiedenen Teile verwenden, wie Sie benötigen. Da der Name Ihrer Stadt aus mehreren Wörtern bestehen kann, gehe ich vom zweiten zum vorletzten Element, um den Städtenamen zu erstellen. Bei dieser Lösung wird davon ausgegangen, dass die Postleitzahl und die Abkürzung für Zustand zwei immer einzelne Wörter sind.

string address = "98225-2077 Bellingham WA"; 
string[] tokens = address.Split(' '); 

string city = ""; 
for (int i=1; i < tokens.Length-1; i++) 
{ 
    if (i > 1) 
    { 
     city += " "; 
    } 
    city += tokens[i]; 
} 

Console.WriteLine("zip code: {0}", tokens[0]); 
Console.WriteLine("city: {0}", city); 
Console.WriteLine("state: {0}", tokens[tokens.Length-1]); 
0

Einfach!

^([\d-]+)\s+(.+?)\s*([A-Z]{2})?$ 

https://regex101.com/r/tL4tN5/1

Erläuterung:

  1. ^([\d-]+): ^ für den Anfang der Zeichenfolge ist. \d für Ziffern
  2. \s+(.+?)\s*: alles in der Mitte zwischen Postleitzahl und Staat Erhalten
  3. ([A-Z]{2})?$: {2} bedeutet 2-Zeichen im angegebenen Bereich [A-Z]. ? bedeutet, dass es 1 oder 0 Mal existiert.
+0

der Staat kann oder kann nicht da sein. Ich arbeite von C# – SJMan

+0

Yup, es kann ohne Zustand arbeiten. Ich aktualisiere die Regex ein wenig, um genauer zu sein. lesen Sie bitte –

0

ich es wirklich ohne regex denken Sie tun können.Hier sind zwei Lösungen:

Non-regex Lösung:

/// <summary> 
/// Split address into ZIP, Description/Street/anything, [A-Z]{2} state 
/// </summary> 
/// <returns>null if no space is found</returns> 
public static List<string> SplitZipAnyStateAddress(this string s) 
{ 
    if (!s.Contains(' ')) return null; 
    var zip = s.Substring(0, s.IndexOf(' ')); 
    var state = s.Substring(s.LastIndexOf(' ') + 1); 
    var middle = s.Substring(zip.Length + 1, s.Length - state.Length - zip.Length - 2); 
    return state.Length == 2 && state.All(p => Char.IsUpper(p)) ? 
     new List<string>() { zip, middle, state } : 
     new List<string>() { zip, string.Format("{0} {1}", middle, state) }; 
} 

Ergebnisse:

StringRegUtils.SplitZipAnyStateAddress("98225-2077 Bellingham WA"); 
// => [0] 98225-2077 [1] Bellingham [2] WA 
StringRegUtils.SplitZipAnyStateAddress("98225-2077 Bellin gham"); 
// => [0] 98225-2077 [1] Bellin gham 
StringRegUtils.SplitZipAnyStateAddress("98225-2077 New Delhi CA"); 
// => [0] 98225-2077 [1] New Delhi [2] CA 

REGEX

Wenn nicht, können Sie meine intial regex Vorschlag verwenden (Ich glaube, ein ? ging verloren):

^(?<zip>\d+-\d+)\s+(?<city>.*?)(?:\s+(?<state>[A-Z]{2}))?$ 

anzeigen regex demo

Details:

  • ^ - Beginn der Zeichenfolge
  • (?<zip>\d+-\d+) - 1+ Ziffern mit - gefolgt mit 1+ Ziffern gefolgt
  • \s+ - 1+ Whitespaces
  • (?<city>.*?) - 0+ andere Zeichen als eine neue Zeile so wenig wie möglich bis zur
  • (?:\s+(?<state>[A-Z]{2}))? - optional (1 oder 0) Vorkommen von
    • \s+ - 1+ Whitespaces
    • (?<state>[A-Z]{2}) - genau 2 Groß ASCII-Buchstaben
  • $ - Ende der Zeichenkette
Verwandte Themen