sql >> Databasteknik >  >> RDS >> Mysql

Matcha Regex i MySQL för upprepade ord med villkor exkludera parenteserna

Jag föreslår detta 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 är lite långt, men det ger lite mer flexibilitet eftersom dessa strängar också anses vara "giltiga":

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

I kod

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

SQLFiddle

Regex-fördelning

Regexet använder faktiskt många repeterande delar, så det är därför det är lite långt:

^                                        # 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

$

Detaljerad uppdelning

  • #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äns matchar början och slutet av ord. Definitionen av ett ord här är en serie av alfabet, siffror och understreck.

[[:<:]] är en inledande ordgräns och matchar alltså i början av ett ord.

[[:>:]] är en inledande ordgräns och matchar alltså i slutet av ett ord.

Deras användning här säkerställer att 2 (och de numeriska/numeriska delarna) är inte omgivna av andra siffror (därav gör 21 misslyckas till exempel) eller räkna en 2 om du till exempel har 21/4 som en som räknas till de två 2 s i strängen.



  1. Fel Nyckelfel 255 när pymysql.connect körs

  2. Cake php Datasource-klassen MySQL kunde inte hittas

  3. MySQL decimalfält returneras som strängar i PHP

  4. Ändra anslutningens tidszon i MySQL