sql >> Database teknologi >  >> RDS >> Mysql

Match Regex i MySQL for gentagne ord med betingelse ekskluder parenteser

Jeg foreslår dette regex:

^([^2]|[[:<:]][0-9]+/[0-9]+[[:>:]])*([[:<:]]|[a-z])2([[:>:]]|[a-z])([^2]|[[:<:]][0-9]+/[0-9]+[[:>:]])+([[:<:]]|[a-z])2([[:>:]]|[a-z])([^2]|[[:<:]][0-9]+/[0-9]+[[:>:]])*$

Det er lidt langt, men det giver noget mere fleksibilitet, idet disse strenge også betragtes som 'gyldige':

(2/2) 2new 2new
2new (2/2) 2new (2/2)
 

I kode

SELECT
    *
FROM
    A
WHERE 
    description REGEXP '^(([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*2([[:>:]]|[a-z])){2}([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])*$'
 

SQLFiddle

Regex-opdeling

Regex bruger faktisk mange gentagne dele, så derfor er det lidt langt:

^ # Beginning of string ( # Open repeat group ([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])* # Any characters. See #1 2 # 2 ([[:>:]]|[a-z]) # Word boundary or alphabet/letter. See #2 ){2} # Close repeat group and repeat 2 times ([^2]+|[[:<:]][0-9]+/[0-9]+[[:>:]])* # Any characters. See #1 $

Detaljeret oversigt

  • #1

    ( # Open group [^2]+ # Any characters except 2 | # OR [[:<:]] # Open word boundary [0-9]+ # Any numbers / # Forward slash [0-9]+ # Any numbers [[:>:]] # Close word boundary )* # Close group and repeat any number of times
  • #2

    (           # Open group
      [[:>:]]   # Word boundary
    |           # Or
      [a-z]     # Letter/alphabet
    )           # Close group
     

En ordgrænse matcher begyndelsen og slutningen af ​​ord. Definitionen af ​​et ord her er en række alfabet, tal og understregningstegn.

[[:<:]] er en indledende ordgrænse og matcher således i begyndelsen af ​​et ord.

[[:>:]] er en indledende ordgrænse og matcher således i slutningen af ​​et ord.

Deres brug her sikrer, at 2 (og de numeriske/numeriske dele) er ikke omgivet af andre tal (derfor gør 21 mislykkes for eksempel) eller tæl en 2 hvis du for eksempel har 21/4 som en, der tæller med i de to 2 s i strengen.



  1. Arbejder med en stor CSV-fil i MATLAB

  2. find det N-te største element i SQL

  3. Spring kolonne over, når du indsætter i MySQL

  4. NAME_IN indbygget i Oracle D2k Forms