Reguliere expressie voor het vinden van losse haken

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Anoniem: 126376

Topicstarter
Concreet zit ik met een tekstbestand van zo'n negentig pagina's. Ik heb het ding al gecontroleerd op spelfouten, dubbele spaties,... en nu dacht ik eens vlug te zoeken op losse haken. Ik open 442 haakjes, maar sluit die slechts 441 keer - er zit er ergens eentje verloren.

Ik werk met TextMate voor de Mac, en die biedt je de mogelijkheid te zoeken op reguliere expressies. Ik zou dus iets moeten hebben dat controleert of er een patroon in het genre van 'letters-cijfers-tekentjes(letters-cijfers-tekentjes(letters-cijfers-tekentjes' bestaat, maar ik weet niet meteen of dit juist is, en hoe ik het moet verwoorden.

Zit er hier een wiz? Thanks!

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Of met een stuk eenvoudiger replace acties: Haal alle newlines weg, zet een newline achter '(' en kijk wat de langste regel is. :Y)

edit:

Als het in regex moet, zou ik ipv 'letters-cijfers-tekentjes' gewoon 'match alles behalve haakjes' opschrijven. ;)

edit2:...te lang bezig met edit...

[ Voor 40% gewijzigd door Voutloos op 18-05-2008 20:07 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Voor deze ene keer dan :>

\([^)]*?\(

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 01-06 18:50

NMe

Quia Ego Sic Dico.

Hoe doe je dat dan met haakjesgroepen tussen haakjes? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Anoniem: 126376 schreef op zondag 18 mei 2008 @ 19:44:
Ik zou dus iets moeten hebben dat controleert of er een patroon in het genre van 'letters-cijfers-tekentjes(letters-cijfers-tekentjes(letters-cijfers-tekentjes' bestaat, maar ik weet niet meteen of dit juist is, en hoe ik het moet verwoorden.
Als je zeker weet dat er geen geneste haakjes zijn (zie -NMe-), dan kan je de regex van Bozozo gebruiken. Zoniet, dan is de suggestie van Voutloos een aardige. Als je regexen met capturing kan gebruiken, dan zou je met \((*?)\) alles tussen een haak openen en haak sluiten kunnen capturen en daar vervolgens weer een match op .*\(.* op los kunnen laten. Daar zou er dan eentje uit moeten rollen.

[ Voor 3% gewijzigd door Confusion op 18-05-2008 20:26 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

-NMe- schreef op zondag 18 mei 2008 @ 20:16:
Hoe doe je dat dan met haakjesgroepen tussen haakjes? ;)
Technisch gezien is dat een match voor 'letters-cijfers-tekentjes(letters-cijfers-tekentjes(letters-cijfers-tekentjes' .

okay okay, totaal niet aan gedacht :P

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • Aetos
  • Registratie: November 2001
  • Laatst online: 30-05 16:39
Regexp kan context vrije grammatica's aan.. Hiermee kan je geen contextgevoelige dingen proberen op te lossen.

En haakjesparen zijn nu juist lekker context gevoelig.

Dus schrijf een parser. En je zult je missende haakje vinden.

Of open het bestand in een van de vele goede programming editors.

Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 23:40

RayNbow

Kirika <3

Aetos schreef op zondag 18 mei 2008 @ 23:12:
Regexp kan context vrije grammatica'sreguliere talen aan.. Hiermee kan je geen contextgevoelige dingen proberen op te lossen.

En haakjesparen zijn nu juist lekker context gevoeligvrij.

Dus schrijf een parser. En je zult je missende haakje vinden.

Of open het bestand in een van de vele goede programming editors.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 06-06 15:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aetos schreef op zondag 18 mei 2008 @ 23:12:
Regexp kan context vrije grammatica's aan.. Hiermee kan je geen contextgevoelige dingen proberen op te lossen.

En haakjesparen zijn nu juist lekker context gevoelig.
Heh, klok en klepel. Haakjes hebben totaal niets met context-vrijheid te maken. Parsers zijn vaak ook context-vrij, en laten juist die nou prima haakjes kunnen interpreteren. Context-vrij wil zeggen dat een non-terminal niet gevoelig is voor de context waarin hij staat, en dus altijd dezelfde productieregels heeft.

Met reguliere expressies kun je ook alleen maar reguliere grammatica's omschrijven - wat slechts een subset is van alle context-vrije grammatica's. Het grote verschil is dat in een reguliere grammatica non-terminals aan de rechterkant van een productieregel alleen maar voor (links-regulier) of na (rechts-regulier) een terminal mogen staan. Bij het parsen van haakjes heb je juist de regel 'haakje-open expressie haakje-sluiten' nodig, waarbij haakje-open en haakje-sluiten terminals zijn, en expressie een non-terminal.
Dus schrijf een parser. En je zult je missende haakje vinden.
Een parser gaat je haakje helemaal niet per definitie vinden. Hij kan zeggen welk haakje uiteindelijk niet is afgesloten, maar als je veel nesting hebt zegt dat weinig. In de meeste gevallen is het ergens een haakje binnen dat buitenste haakje dat niet afgesloten wordt, maar door de haakjes sluiten die erop volgen wordt dat haakje dus wel afgesloten, ten koste van een haakje op een hoger niveau.

Echter in een geschreven tekst zal er weinig nesting zijn, en dan vind je bij het parsen idd het onafgesloten haakje-openen. Maar in een dergelijk geval voldoet de reguliere expressie van Bozozo ook prima. Goed, als je een paar nestings hebt zul je ook wat meerdere matches hebben, maar dat zou nou niet zo'n heel erg probleem moeten zijn om doorheen te bladeren - een stuk minder dan die 442 haakjes-openen :)

[ Voor 11% gewijzigd door .oisyn op 18-05-2008 23:41 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Sowieso schiet je er niets mee op: je krijgt alleen te horen dat aan het einde een haakje mist, maar dat wist je al! Wat je wilt is weten waar het haakje mist, en dat gaat je niet lukken zonder uit te zoeken welke haakjes bij elkaar horen... en dat kan niet. (het gaat met bv html wel goed omdat je dan weet dat <body> en </body> bij elkaar horen. Dan nog gaat hte trouwens niet altijd goed)

Acties:
  • 0 Henk 'm!

  • Aetos
  • Registratie: November 2001
  • Laatst online: 30-05 16:39
Oeps.. Hm.. ik zat een laag te laag met mijn naamgeving...


Regulier.
Contextvrij.
Contextgevoelig.
Turingbeslisbaar.


Je hebt een stapelautomaat nodig om te bepalen waar er technisch een haakje mist.. Of je dan de goede betekenis krijgt zul je idd zelf moeten bepalen.

EDIT:
Waar het mij om ging is om te zeggen dat een reguliere expressie in dit geval niet het middel is om te zoeken.

Het is trouwens niet perse het laatste haakje dat mist. Er kunnen nog veel meer haakjes fouten inzitten. En die zullen door de (nog) fictieve parser wel gevonden worden.

)))))))))((((((((((

())((

(()()()()

[ Voor 22% gewijzigd door Aetos op 19-05-2008 00:14 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 06-06 15:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aetos schreef op zondag 18 mei 2008 @ 23:51:
Waar het mij om ging is om te zeggen dat een reguliere expressie in dit geval niet het middel is om te zoeken.
Gezien de aard van het geschreven woord lijkt mij het een stuk sneller om met de regex zoals voorgesteld door Bozozo door de tekst te gaan om het haakje te vinden, dan zelf even een simpele parser te schrijven ;). Die regex rapporteert nooit false negatives, en false positives krijg je alleen bij nesting, wat doorgaans zeldzaam is in tekst (zodat je in die gevallen makkelijk met de hand kunt bepalen waar je het haakje vergeten bent - iets wat je met de parser sowieso ook moet doen).
Het is trouwens niet perse het laatste haakje dat mist. Er kunnen nog veel meer haakjes fouten inzitten. En die zullen door de (nog) fictieve parser wel gevonden worden.

)))))))))((((((((((

())((

(()()()()
Natuurlijk. In theorie heb je zeker gelijk. Maar zoals ik al zei, zo zit geschreven tekst niet in elkaar. Hoeveel tekst heb jij geschreven waarin je consequent het haakje-openen vergeten was? :) Het derde voorbeeld wordt overigens gewoon in 1 keer gevonden door de voorgestelde regex.

[ Voor 50% gewijzigd door .oisyn op 19-05-2008 15:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Aetos schreef op zondag 18 mei 2008 @ 23:51:
Je hebt een stapelautomaat nodig om te bepalen waar er technisch een haakje mist..
'Stapelautomaat' :D
Heb je het ook altijd over een centrale verwerkings eenheid? ;)

{signature}


Acties:
  • 0 Henk 'm!

Anoniem: 126376

Topicstarter
Wat een reacties - enorm bedankt.

Omdat ik niet gek veel geneste haakjes gebruikte, nam ik gewoon \([^)]*?\( en keek ik handmatig wat er niet klopte. Bij de tweede hit was het al prijs! Wat een tijdbesparing.
Pagina: 1