Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Regexp] Zoekopdracht ontleden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Regular expressions zijn geheel nieuw voor mij. Ik heb ze juist altijd gemeden wegens de ogenschijnlijke complexiteit. Maargoed, waar ik regular expressions nu voor nodig heb is het parsen van een zoekopdracht. Net als bijvoorbeeld in Google, alleen dan zonder dingen als - en ~. Gewoon queries als:

"regular expressions" "search string" parse

En dan dus "regular expressions", "search string" en "parse" eruit halen (maar dan zonder quotes). Nu is het me al gelukt met minimale kennis van regular expressions, maar ik heb het idee dat het efficienter kan of dat er tenminste overbodige dingen uit kunnen. Ik heb op dit moment het volgende:

(?>"(?<keyword>[^"]+)"\s?)|(?<keyword>[^"^\s]+)

Wat dit in feite doet is op zoek gaan naar twee soorten invoer: met quotes en zonder quotes (dus "keyword keyword ..." en keyword). De " is dus optioneel, maar alles tussen twee " moeten gegroepeerd worden; de " optioneel maken werkt dus niet, vandaar twee soorten zoekopdrachten gescheiden door een pipe.

Zoals gezegd werkt het perfect, alleen kan het wellicht korter en/of efficienter. Ideeën? Als het er goed uitziet, dan ook graag even melden :)

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Ik begrijp niet wat je met al die ^ moet... ik zou het zo doen:
code:
1
"(.+?)"|(\w+?)

Ik gebruik hier +? ipv * omdat dit non-greedy werkt, zodat de regex regular expressions matcht en niet regular expressions" "search string

Disclaimer: niet getest ;)

日本!🎌


Verwijderd

Topicstarter
_Thanatos_ schreef op woensdag 17 oktober 2007 @ 10:46:
Ik begrijp niet wat je met al die ^ moet... ik zou het zo doen:
code:
1
"(.+?)"|(\w+?)

Ik gebruik hier +? ipv * omdat dit non-greedy werkt, zodat de regex regular expressions matcht en niet regular expressions" "search string

Disclaimer: niet getest ;)
Bedankt voor je suggestie. Heb hem even geprobeerd en de strings tussen quotes komen goed door. De gewone woorden helaas niet. Hij lijkt alle losse characters dan op te splitsen in groepen. Het losse woord "test" worden dus vier groepen (t, e, s en t). Ik had de \w ook al geprobeerd (maar dan zonder +?), en kreeg toen net zo'n soort resultaat. Wat is er mis met alles behalve whitespace en "?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20:32
Waarom niet gewoon a|b|c waarbij die letters je zoektermen zijn? Denk er trouwens aan dat je speciale letters in je zoektermen moet escapen op de een of andere manier (of je moet ze uit je query gooien, zoals Google ook ongeveer doet).

Verder: waarin ga je zoeken? Ik heb namelijk het vermoeden dat reguliere expressies hier niet de tool for the job zijn.

[ Voor 30% gewijzigd door Soultaker op 17-10-2007 16:51 ]


Verwijderd

Topicstarter
Soultaker schreef op woensdag 17 oktober 2007 @ 16:49:
Waarom niet gewoon a|b|c waarbij die letters je zoektermen zijn? Denk er trouwens aan dat je speciale letters in je zoektermen moet escapen op de een of andere manier (of je moet ze uit je query gooien, zoals Google ook ongeveer doet).
Het is inderdaad een optie om gewoon losse woorden te nemen. Je kunt dan gewoon splitten met een spatie en dan heb je dus helemaal geen regular expressions nodig. Ik wil juist de functionaliteit uitbreiden en de mogelijkheid bieden om zoekwoorden te combineren.

Wat betreft het escapen: om welke speciale letters gaat het dan? Ik include nu alles behalve een ". Met andere woorden, alles tussen twee " wordt meegenomen.
Soultaker schreef op woensdag 17 oktober 2007 @ 16:49:
Verder: waarin ga je zoeken? Ik heb namelijk het vermoeden dat reguliere expressies hier niet de tool for the job zijn.
Ik ga zoeken in tekst. Properties van business objects om precies te zijn. In de huidige vorm goed vergelijkbaar met een filter. Ik zoek trouwens niet met regular expressions, ik gebruik ze alleen om de zoekstring die de gebruiker intypt op te splitsen in zoektermen die gegroepeerd kunnen zijn.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20:32
Ohhh, dan heb ik je helemaal verkeerd begrepen. Ik dacht dat je probeerde met reguliere expressies tekst te matchen.

Iets in de richting van:
code:
1
"([^"]+)"|([^"\s]+)

Lijkt me dan ook al genoeg, en dan gewoon alle matches vinden?

Verwijderd

Topicstarter
Soultaker schreef op donderdag 18 oktober 2007 @ 14:46:
Iets in de richting van:
code:
1
"([^"]+)"|([^"\s]+)

Lijkt me dan ook al genoeg, en dan gewoon alle matches vinden?
Ja precies. Dat is ongeveer waar ik ook uitgekomen was, alleen in jouw regular expression heb je nog quotes in een gecombineerde zoekstring. Als je intypt:

"zoekwoorden combinatie" zoekwoord1 zoekwoord2

Krijg je:

"zoekwoorden combinatie"
zoekwoord1
zoekwoord2

Ik wilde die quotes nog even wegwerken :) Ik kwam toen op mijn regular expression uit met twee groepen met een naam, zodat ik gewoon de waarden uit de juiste groepen kan halen. We hebben dezelfde regular expression, alleen ik heb nog namen voor groepen erin. Bedankt iig!
Pagina: 1