2016-06-02 26 views
1

Ich habe ein Problem mit der Regex-Syntax in Mysql, wenn es darum geht, whitespaces in Strings zu entsprechen.MySQL Matching Leerzeichen in Regex

Ich habe eine Datenbank von Postleitzahlen im Format:
1111 AA CITYNAME oder 1111 CITYNAME.

Daraus mag ich die zipcode und den Städtenamen extrahieren, habe ich den folgenden Code:

DROP FUNCTION IF EXISTS GET_POSTALCODE; 
CREATE FUNCTION GET_POSTALCODE(input VARCHAR(255)) 
    RETURNS VARCHAR(255) 
    BEGIN 
    DECLARE output VARCHAR(255) DEFAULT ''; 
    IF input LIKE '^[1-9][0-9]{3}[[:blank:]][A-Z]{2}[[:blank:]]%' 
    THEN 
     SET output = SUBSTRING(input, 1, 7); 
    ELSE 
     SET output = SUBSTRING(input, 1, 4); 
    END IF; 
    RETURN output; 
    END 

Ich würde das Ergebnis für eine Eingabezeichenfolge von 9741 NE Groningen erwartet in 9741 NE und Groningen aufgeteilt werden.

Aber stattdessen bekomme ich 9741 und NE Groningen.

Ich habe alle möglichen Dinge versucht, die Whitespace, die ich denke, ist das Problem. Ich habe versucht:

  • [[:blank:]]
  • [:blank:]
  • [[:space:]]
  • [:space:]
  • und die \s Methode

[:space:] Sollten alle Leerzeichen übereinstimmen, aber noch einmal, das gleiche Resultat.

Nichts, was ich versuche, scheint zu funktionieren, könnten Sie mir vielleicht in die richtige Richtung zeigen?

Vielen Dank!

+0

dies "AA" von "1111 AA CITYNAME" immer zwei Zeichen lang oder kann es mehr oder weniger sein? – davidbucka

+0

Die Buchstaben sind immer 2, nicht mehr, aber in einigen Fällen werden die 2 Buchstaben nicht geliefert, und den 4 Zahlen folgt sofort ein Leerzeichen und der cityName – MalumAtire832

+0

okay - ich weiß jetzt nicht weiter, aber vielleicht wird dir das zeigen in eine bessere Richtung: \ s + (? = \ S * + $) gibt dir den letzten Whitespace, aber ich bekomme nicht, wie ich danach und danach werden soll. – davidbucka

Antwort

1

Foreward

Sie können PCRE aktivieren, wenn Sie this library

Beschreibung

verwenden
^([0-9]{4}(?:[[:blank:]]+[a-z]{2}(?=[[:blank:]]))?)[[:blank:]](.*$) 

Regular expression visualization

Dieser reguläre Ausdruck wird wie folgt vor:

  • den 4-stellige Codes gefolgt finden durch ein optionales zwei Zeichen
  • Spiel des Rest der Zeichenfolge, die ein Stadtname

Beispiel

Live Demo

https://regex101.com/r/sE3xN7/4

sein sollten

Beispieltext

Hinweis Ihre Beispiele hatten nur 4-stellige Codes, also nahm ich die Freiheit, das Hinzufügen einer zusätzlichen Ziffer

1111 AA CITYNAME1 
2222 CITYNAME2 
3333 Las Vegas 
4444 BB Las Vegas 
9741 NE Groningen 

Probe Spiele

MATCH 1 
1. [0-7] `1111 AA` 
2. [8-17] `CITYNAME1` 

MATCH 2 
1. [18-22] `2222` 
2. [23-32] `CITYNAME2` 

MATCH 3 
1. [33-37] `3333` 
2. [38-47] `Las Vegas` 

MATCH 4 
1. [48-55] `4444 BB` 
2. [56-65] `Las Vegas` 

MATCH 5 
1. [66-73] `9741 NE` 
2. [74-83] `Groningen` 

Erklärung

NODE      EXPLANATION 
---------------------------------------------------------------------- 
^      the beginning of a "line" 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    [0-9]{4}     any character of: '0' to '9' (4 times) 
---------------------------------------------------------------------- 
    (?:      group, but do not capture (optional 
          (matching the most amount possible)): 
---------------------------------------------------------------------- 
     [[:blank:]]+    whitespace (\n, \r, \t, \f, and " ") 
           (1 or more times (matching the most 
           amount possible)) 
---------------------------------------------------------------------- 
     [a-z]{2}     any character of: 'a' to 'z' (2 times) 
---------------------------------------------------------------------- 
     (?=      look ahead to see if there is: 
---------------------------------------------------------------------- 
     [[:blank:]]    whitespace (\n, \r, \t, \f, and " ") 
---------------------------------------------------------------------- 
    )      end of look-ahead 
---------------------------------------------------------------------- 
    )?      end of grouping 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    [[:blank:]]     whitespace (\n, \r, \t, \f, and " ") 
---------------------------------------------------------------------- 
    (      group and capture to \2: 
---------------------------------------------------------------------- 
    .*      any character except \n (0 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    $      before an optional \n, and the end of a 
          "line" 
---------------------------------------------------------------------- 
)      end of \2 
----------------------------------------------------------------------