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

regex: *niet* matchen op backreference

Pagina: 1
Acties:

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoihoi

Ik zit wat met regexen te spelen en wil woorden van 4 karakters selecteren waarbij letter2 == letter3, maar letter1!= letter4.

Hiervoor gebruik ik een standaardwoordenlijst met de volgende grep aanroep:
grep -E "^.([a-z])\1.$" OpenTaal-210G-basis-gekeurd.txt

Dit selecteert de 2 middelste letters.

Als ik nu nog met letter1 en letter4 aan de slag moet heb ik nog een backreference nodig:
grep -E "^([a-z])([a-z])\2.$" OpenTaal-210G-basis-gekeurd.txt

Je ziet dat ik hier niets met de eerste backreference doe. Ik krijg dat namelijk niet voor elkaar. Ja je moet de negatie doen met een ^... en dan?

Ik heb geprobeerd:
grep -E "^([a-z])([a-z])\2^\1$" OpenTaal-210G-basis-gekeurd.txt
grep -E "^([a-z])([a-z])\2^[\1]$" OpenTaal-210G-basis-gekeurd.txt
grep -E "^([a-z])([a-z])\2[^\1]$" OpenTaal-210G-basis-gekeurd.txt


en nog wat van dat soort dingen. Dat werkt niet. Iemand een tipje? :)

[ Voor 7% gewijzigd door Boudewijn op 24-12-2013 23:24 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Gebruik een negated look-ahead:
code:
1
^([a-z])([a-z])\2(?!\1)[a-z]$

Intentionally left blank


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Waarbij het handig is om erbij te zeggen dat die lookahead non-capturing is, waardoor die [a-z] er inderdaad achter moet. :)

'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.


  • Daos
  • Registratie: Oktober 2004
  • Niet online
offtopic:
Nog steeds met de kerstpuzzel bezig?

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Check. Je denkt toch niet dat je die in een paar dagen uitspeelt? Heb vanaf vandaag geen vacantie meer, maar idd dit is voor het grote doel "kerstpuzzle" ja :).


@NMe+crisp: thanks heren! Dat was het idd. Wel even mijn quotes om moeten gooien naar single-quotes en grep in Perl mode (-P ) gezet om het werkend te krijgen. Mooi dus!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Ik ben nog steeds bezig met regex (vwg die puzzel ja), maar heb nog een issue waar ik niet uitkom.
Aan de hand van een dictionary zoek ik een woord met deze samenstelling:

PSLNOEVFADOVTAFAPQAENXLAVFARKEAKSP

(de dictionary genereer ik zelf, maar dat terzijde)

Hierbij dienen een of meer karakters vervangen te worden door een ander karakter. Prima, ik kan best scripten dat ik een aardig eind kom:
code:
1
([a-z])([a-z])([a-z])([a-z])([a-z])([a-z])([a-z])([a-z])([a-z])([a-z])\5\7([a-z])\9\8\9\1([a-z])\9\6\4([a-z])\3\9\7\8\9([a-z])([a-z])\6\9([a-z])\2\1

Het probleem dat ik hiermee heb is dat ik niet af kan dwingen dat de eerste [a-z] NIET gelijk is aan de tweede [a-z] etc.

Ik wil dus eigenlijk als 2e [a-z] een karakter hebben uit de set [a-z] exclusief \1 . Voor de 3e [a-z] is dat exclusief \1 en \2 . Nu heb ik wat zitten pielen met de ^ maar ik krijg dit niet voor elkaar.

Kan iemand me hier nog een bumpje de goede kant op geven?
Pagina: 1