---
title: "REGEXP är detta samma sak?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/159643-regexp-är-detta-samma-sak"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "LR^evil.sid"
published: "2007-04-25T12:56:14.000Z"
updated: "2007-04-26T11:15:19.000Z"
replies: 22
views: 959
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/159643-regexp-är-detta-samma-sak"
---

# REGEXP är detta samma sak?

_Sida 1 av 2._

## #1 — LR^evil.sid, 2007-04-25T12:56Z

MySQL 5.1

Sitter å kikar på en gammal SQL-fråga för att sålla ut icke önskvärda poster i ett urval och tänkte att det där måste kunna göras smidigare med REGEXP.

Till frågan, Är detta:

```
            AND NOT LCASE(RIGHT(kunder.namn,4))=' ab.'
            AND NOT LCASE(RIGHT(kunder.namn,4))=' hb.'
            AND NOT LCASE(RIGHT(kunder.namn,3))=' ab'
            AND NOT LCASE(RIGHT(kunder.namn,3))=' hb'
            AND NOT LCASE(LEFT(kunder.namn,3))='hb.'
            AND NOT LCASE(LEFT(kunder.namn,3))='ab.'
            AND NOT LCASE(LEFT(kunder.namn,3))='ab '
            AND NOT LCASE(LEFT(kunder.namn,3))='hb '
            AND NOT LCASE(kunder.namn)='ab'
            AND NOT LCASE(kunder.namn)='hb'
```

samma sak som

```
            AND NOT LCASE(kunder.namn) REGEXP '[ ][ab][.]{0,}$|[ ][hb][.]{0,}$|^[ab][.]{0,}|^[hb][.]{0,}|^[ab][ ]{0,}|^[hb][ ]{0,}|^[ab]$|^[hb]$|'
```

strukturerat

```
AND NOT LCASE(kunder.namn) REGEXP '[ ][ab][.]{0,}$|
[ ][hb][.]{0,}$|
^[ab][.]{0,}|
^[hb][.]{0,}|
^[ab][ ]{0,}|
^[hb][ ]{0,}|
^[ab]$|
^[hb]$|'
```

Går det att göra med en kortare REGEXP sträng? Hur skulle den se ut i så fall?

Permalänk: https://www.webforum.nu/p/159643

## #2 — LR^evil.sid, 2007-04-25T13:37Z

Det kunde vi ju snabbt konstatera att det \_inte\_ var.
Har fortsatt pilla och kommit fram till detta:

> AND LCASE(kunder.namn) NOT REGEXP '^\[ah\]b$\|\[\[:space:\]\]{1}\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])\*$'

vilket get ett resultat på 218153 rader på 49.81 sek

medan

> AND NOT LCASE(RIGHT(kunder.namn,4))=' ab.' 
> AND NOT LCASE(RIGHT(kunder.namn,4))=' hb.' 
> AND NOT LCASE(RIGHT(kunder.namn,3))=' ab' 
> AND NOT LCASE(RIGHT(kunder.namn,3))=' hb' 
> AND NOT LCASE(LEFT(kunder.namn,3))='hb.' 
> AND NOT LCASE(LEFT(kunder.namn,3))='ab.' 
> AND NOT LCASE(LEFT(kunder.namn,3))='ab ' 
> AND NOT LCASE(LEFT(kunder.namn,3))='hb ' 
> AND NOT LCASE(kunder.namn)='ab' 
> AND NOT LCASE(kunder.namn)='hb'

ger ett resultat på 218139 rader på 47.78 sek

Tips på hur jag kommer åt de 14 sista raderna?

EDIT

> AND LCASE(kunder.namn) NOT REGEXP '^\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])\*\|^\[ah\]b$\|\[\[:space:\]\]{1}\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])\*$'

Ger 218102 rader på 47.67 sek

Permalänk: https://www.webforum.nu/p/1969915

## #3 — spango, 2007-04-26T06:19Z

Exakt *vad* är det tänkt att regexpen ska matcha? Får inte riktigt grepp om saken. Att strängen inte får innehålla "ab" eller "hb" på vissa ställen förstår jag, men i vilka sammanhang? Kan du ge exempel?

Permalänk: https://www.webforum.nu/p/1970058

## #4 — LR^evil.sid, 2007-04-26T06:47Z

REGEXP-strängen skall ersätta

> AND NOT LCASE(RIGHT(kunder.namn,4))=' ab.' 
> AND NOT LCASE(RIGHT(kunder.namn,4))=' hb.' 
> AND NOT LCASE(RIGHT(kunder.namn,3))=' ab' 
> AND NOT LCASE(RIGHT(kunder.namn,3))=' hb' 
> AND NOT LCASE(LEFT(kunder.namn,3))='hb.' 
> AND NOT LCASE(LEFT(kunder.namn,3))='ab.' 
> AND NOT LCASE(LEFT(kunder.namn,3))='ab ' 
> AND NOT LCASE(LEFT(kunder.namn,3))='hb ' 
> AND NOT LCASE(kunder.namn)='ab' 
> AND NOT LCASE(kunder.namn)='hb'

Permalänk: https://www.webforum.nu/p/1970063

## #5 — spango, 2007-04-26T07:31Z

Ja, så långt är jag med, men ärligt talat orkar jag inte sätta mig ner och grunna på exakt vilka strängar som matchar det där och vilka som inte gör det. Har du lust att, med egna ord och inte kod, förklara vad det är du vill göra? :) Anledningen till varför jag tjatar är för att jag tror att det går att optimera rätt rejält genom att ersätta det med en regexp som inte gör exakt samma sak men som ger samma resultat.

Permalänk: https://www.webforum.nu/p/1970076

## #6 — LR^evil.sid, 2007-04-26T07:47Z

ur urvalet sålla bort alla stängar som:
\* är exakt ab el. hb
\* börjar med ab följt av mellanslag
\* börjar med ab följt av punkt
\* börjar med hb följt av mellanslag
\* börjar med hb följt av punkt
\* slutar med mellanslag följt av ab
\* slutar med mellanslag följt av hb
\* slutar med mellanslag följt av ab följt av punkt
\* slutar med mellanslag följt av hb följt av punkt

testade
'^\[ah\]b$'
mot
AND NOT LCASE(kunder.namn)='ab' 
AND NOT LCASE(kunder.namn)='hb'
Det gav samma resultat : ) så jag antar att den delen är avklarad.

testade
^\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])\*
mot
AND NOT LCASE(LEFT(kunder.namn,3))='hb.'
AND NOT LCASE(LEFT(kunder.namn,3))='ab.'
AND NOT LCASE(LEFT(kunder.namn,3))='ab '
AND NOT LCASE(LEFT(kunder.namn,3))='hb '
199160 mot REGEXP's 199107

testade
\[\[:space:\]\]+\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])\*$
mot
AND NOT LCASE(RIGHT(kunder.namn,4))=' ab.'
AND NOT LCASE(RIGHT(kunder.namn,4))=' hb.'
AND NOT LCASE(RIGHT(kunder.namn,3))=' ab'
AND NOT LCASE(RIGHT(kunder.namn,3))=' hb'
Det gav samma resultat : ) så jag antar att den delen är avklarad också.

Permalänk: https://www.webforum.nu/p/1970080

## #7 — spango, 2007-04-26T08:17Z

OK, så mycket för mina optimeringsplaner :)
*^\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])\** strular på grund av stjärnan. Nu är den regexpen faktiskt ekvivalent med *^\[ah\]b*, läser man ut den blir det "börjar med ett 'a' eller 'h', som följs av 'b', som följs av noll eller fler mellanslag och/eller punkter". Av samma anledning kanske du vill byta ut stjärnan i sista regexpen mot frågetecken (så att det blir "en eller ingen punkt" istället för "noll eller flera punkter"). Inte strikt nödvändigt, men nu matchar den exempelvis även "fubar ab.." också.

Jag tror att det här borde klara biffen:
*^\[ah\]b$\|^\[ah\]b\[\[\[:punct:\]\]\[\[:space:\]\]\]\|\[\[:space:\]\]+\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])?$*

Permalänk: https://www.webforum.nu/p/1970092

## #8 — LR^evil.sid, 2007-04-26T08:22Z

REGEXP: AND LCASE(kunder.namn) NOT REGEXP '^\[ah\]b$\|^\[ah\]b\[\[\[:punct:\]\]\[\[:space:\]\]\]\|\[\[:space:\]\]+\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])?$'
198790 rader mot 198777

får med regexp tillbaka 13 rader jag inte vill ha

Permalänk: https://www.webforum.nu/p/1970096

## #9 — spango, 2007-04-26T08:35Z

... som ser ut hur?

Permalänk: https://www.webforum.nu/p/1970104

## #10 — LR^evil.sid, 2007-04-26T08:36Z

vet inte. hur jämnför jag det enklast? det är ju trots allt ca 200000 rader

EDIT, regexp träffar 2138 rader, WHERE NOT IN... skall fila på det

Permalänk: https://www.webforum.nu/p/1970107

## #11 — LR^evil.sid, 2007-04-26T09:17Z

De raderna har ett bindestreck någonstans efter ab
ex:
Ab Härnösands Schakt- Och Trädg
Ab Nord-Emballage

Permalänk: https://www.webforum.nu/p/1970117

## #12 — spango, 2007-04-26T09:29Z

Va? Men de raderna borde du ju få fram även med icke-regexpvarianten.

Permalänk: https://www.webforum.nu/p/1970118

## #13 — LR^evil.sid, 2007-04-26T09:41Z

Kollade lite noggrannare och bindestrecket har inte med saken att göra

13 rader:
Ab.
Ab Nord-Emballage
Ab Härnösands Schakt- Och Trädg
Ab Härnösands Schakt- Och Trädg
Ab Härnösands Schakt- Och Trädg
Ab Härnösands Schakt- Och Trädg
Ab Härnösands Schakt- Och Trädg
Ab Emil Lundgrens Bil- Och
Ab Emil Lundgrens Bil- Och
Ab Finskören
Ab Previa
Ab T Wasserman
Ab T Wasserman

antar att denna inte fungerar som den skall: ^\[ah\]b\[\[\[:punct:\]\]\[\[:space:\]\]\]

Permalänk: https://www.webforum.nu/p/1970122

## #14 — spango, 2007-04-26T09:43Z

Men varför vill du inte ha de här raderna? Det ser mer som en bugg i nonregexpvarianten att de inte kom med, än att det är en bugg i regexpen som gör att de kommer med. :q

Permalänk: https://www.webforum.nu/p/1970123

## #15 — LR^evil.sid, 2007-04-26T09:58Z

Det går inte att skilja ut AB/HB på annat sätt ur databasen som den ser ut nu och inga AB/HB skall vara med i urvalet

Permalänk: https://www.webforum.nu/p/1970131

## #16 — spango, 2007-04-26T10:05Z

Ah, såklart, det var bara jag som tänkte fel. Tänkte att det var "WHERE strängen REGEX mönstret" och inte "WHERE strängen NOT REGEX mönstret" :r 
Men det är ett skumt fel. Lyckas den sortera bort några poster som börjar på "Ab" alls?

Permalänk: https://www.webforum.nu/p/1970136

## #17 — LR^evil.sid, 2007-04-26T10:09Z

Ja det gör det, det verkar bara som att det är när ab följs av mellanslag eller punkt

Permalänk: https://www.webforum.nu/p/1970137

## #18 — LR^evil.sid, 2007-04-26T10:29Z

Men om du anser det vara en bugg

> **spango skrev:**
>
> Det ser mer som en bugg i nonregexpvarianten att de inte kom med, än att det är en bugg i regexpen som gör att de kommer med.

Så får WHERE-klasulen se ut så här då.

> AND NOT LCASE(LEFT(kunder.namn, 3)) = 'ab '
> AND NOT LCASE(LEFT(kunder.namn, 3)) = 'ab.'
> AND LCASE(kunder.namn) NOT REGEXP '^\[ah\]b$\|^\[ah\]b\[\[\[:punct:\]\]\[\[:space:\]\]\]\|\[\[:space:\]\]+\[ah\]b(\[\[\[:punct:\]\]\[\[:space:\]\]\])?$';

Borde jag skriva en rapport till MySQL oxå?

Permalänk: https://www.webforum.nu/p/1970142

## #19 — spango, 2007-04-26T10:36Z

Det som är mest sannolikt att lida av en bugg i den här tråden är nog min hjärna, är jag rädd ;)

Fast testa att köra typ *SELECT 'Ab Previa' REGEXP '^\[ah\]b\[\[\[:punct:\]\]\[\[:space:\]\]\]'* och se om det ger en etta som svar. Gör det inte det är något fel, antingen på hur vi förstått regexp-syntaxen, eller på regexpmotorn. Får du däremot tillbaka en etta är något fel på hur regexpen sätts samman med de andra bitarna.

Permalänk: https://www.webforum.nu/p/1970143

## #20 — LR^evil.sid, 2007-04-26T10:43Z

får inte en etta, får en nolla

Permalänk: https://www.webforum.nu/p/1970146

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/159643-regexp-är-detta-samma-sak  
Nästa sida: https://www.webforum.nu/amne/databaser-sql/159643-regexp-är-detta-samma-sak/page2.md
