Gebruiker:Milliped/Regex-tips

Tips van collega's over regexen.

  • Generieke tip van werkcollega: ChatGPT doet goeie regexen.

Regex voor vervangen bestandsnaam bovenkast/onderkast bewerken

(bron)

Hoi, ik ben lui en wil derhalve niet te veel typen. Er is een tabel die ik wil omkatten, en daarin kom ik een strings tegen die er zo uitzien: <!--[[File:Emojione 1F1E7-1F1F1.svg|32px]]-->. Deze wil ik vervangen door een string die er zo uitziet [[File:Twemoji12 1f1e7-1f1f1.svg|32px]]. De hex waarden zijn verschillend, en in de gewenste versie in onderkast. In Notepad++ schijn je de regex find: (\w*)en dan een replace: \L$1 om kapitalen in een word om te kunnen zetten naar onderkast, maar dan zit ik nog met de rest van de string. In de rest van de tabel staan niet-commented-out strings met een hexwaarde, en die kunnen wel blijven staan. Iemand een idee hoe dit te doen? Milliped (overleg) 11 apr 2021 10:43 (CEST)

Om te beginnen zou je (\w*) beter kunnen vervangen door (\w+), om geen 'zero-length' matches te krijgen. 77.164.133.132 11 apr 2021 11:12 (CEST)
In mijn Notepad++ werkt dit: Find what: File:Emojione (\w+)-(\w+) Replace with: File:Twemoji12 \L$1-\L$2 77.164.133.132 11 apr 2021 11:17 (CEST)
En als je uitsluitend de 'outcommented cases' wilt pakken, doe je Find what: <!--\[\[File:Emojione (\w+)-(\w+) Replace with: <!--[[File:Twemoji12 \L$1-\L$2 77.164.133.132 11 apr 2021 11:38 (CEST)
Waarom wil je hoe dan ook unicodes naar lowercase omzetten? --Sb008 (overleg) 11 apr 2021 11:55 (CEST)
Omdat de filename op commons in lowercase is bijvoorbeeld? zie  . 77.164.133.132 11 apr 2021 11:57 (CEST)
Weet je het zeker? Emoji vlagsequentie#huidige vlagsequenties gebaseerd op Regional Indicators --Sb008 (overleg) 11 apr 2021 12:02 (CEST)
Ja zeker wel. Daar is het ook voor. De Emojione set kent er een hoop niet, Twemoji wel. Grote dank aan 77.164.133.132. Milliped (overleg) 11 apr 2021 12:05 (CEST)
Als je er alsnog niet uitkomt, Milliped, of nog andere wensen hebt: vraag gerust verder. Ik ben geen echte expert, maar heb al wel veel van regular expressions gebruikgemaakt om mijn productiviteit flink te vergroten (ander woord voor luiheid). 77.164.133.132 11 apr 2021 12:09 (CEST)
Ik begrijp nu pas wat de volledige bedoeling is: de niet bestaande en outcommented filenames vervangen door wel bestaande files. De volledige regex is dan:
Find what: <!--\[\[File:Emojione (\w+)-(\w+).svg\|32px\]\]-->
Replace with: [[File:Twemoji12 \L$1-\L$2.svg|32px]]
De vierkante haken en de 'pipe' zijn karakters met een functie in RegEx, en moeten met een backslash ge-escaped worden om ze als tekst te lezen. Succes ermee! 77.164.133.132 11 apr 2021 12:21 (CEST)

Haakjes rond string met spaties bewerken

Hoi, ik had dit al eens gevraagd en ben het vergeten: Hoe kan je als je in platte tekst een lijst hebt met regex (in Notepad++ bijvoorbeeld, Excel is ook goed) iedere regel vooraf laten gaan door [[ en laten eindigen met ]]? Op iedere regel kunnen ook elementen staan die een spatie bevatten, dus per woord lukt het niet (alhoewel ik daar graag ook een regex voor zou weten). Dank! Milliped (overleg) 27 feb 2016 22:13 (CET)

Na wat gegoegel kom ik er achter dat in Notepad++ zoeken naar ^([A-Za-z0-9]+)$ en dan vervangen door [[\1]] werkt voor "hele woorden" (zonder spaties), maar dat dat niet werkt voor regels met spaties. Milliped (overleg) 27 feb 2016 22:45 (CET)
Ik doe dat altijd in Google Sheets (of Excel, of onder Linux met Open Office), in kolom A zet ik alle waarden, in kolom B een formule als =concatenate('[[',A1,']]') en dan heb je in kolom B de tekst uit A met haken erom heen. ed0verleg 27 feb 2016 23:21 (CET)
Voor Notepad++ is de oplossing simpel: ^([A-Za-z0-9 ]+)$ (gewoon een spatie toevoegen aan je regex), maar Edo's oplossing werkt ook. Mbch331 (Overleg) 28 feb 2016 09:16 (CET)
Dank heren. Ik ga het eens proberen :-) Milliped (overleg) 28 feb 2016 10:22 (CET)

Regexen van Michiel1972 bewerken

Zoek & vervang met vasthouden variabele bewerken

Dag allemaal. Ik heb de afgelopen dagen duizenden Indiase plaatsen aangemaakt en ik ben nu bezig met het verwerken van de links naar doorverwijspagina's (WP:LND/D). Ik denk een manier te hebben gevonden om dit supersnel te doen met AWB, maar ik kom niet echt uit Regex. Het is vrij simpel:

find= "district = DEZEMOETHIJONTHOUDEN"
replace= "district = DEZEMOETHIJONTHOUDEN (district)|DEZEMOETHIJONTHOUDEN"

&

find= "in het district DEZEMOETHIJONTHOUDEN"
replace= "in het district DEZEMOETHIJONTHOUDEN (district)|DEZEMOETHIJONTHOUDEN"

Nu ben ik echt een leek op het gebied van regular expression, maar ik weet dat dit kan met %1 of $1 ofzo. Kan iemand mij hiermee helpen? Grashoofd 15 apr 2013 11:32 (CEST)

Volgens mij moet het werken als je 1, 2 of 4 backslashes voor de speciale tekens |, ( en ) zet. Als in "in het district DEZEMOETHIJONTHOUDEN \\(district\\)\\|DEZEMOETHIJONTHOUDEN". Of het er 1 2 of 4 moeten zijn weet ik niet: ik ken AWB niet. — Zanaq (?) 15 apr 2013 11:37 (CEST)
(na bwc): Zo uit mijn hoofd en kort gezegd:
find= "district \= \[\[(.*?)\]\]"
replace= "district = [[$1 (district)|$1]]"
Pompidom (overleg) 15 apr 2013 11:38 (CEST)
Super, dank jullie wel! Grashoofd 15 apr 2013 11:45 (CEST)

Zoek iets en vervang daarmee iets anders bewerken

Hoi, AWB vraagje. Ik wil een defaultsort vervangen door iets dat verder naar boven als een string in een artikel te vinden is. De string waar ik de data uit haal wil ik eigenlijk ongemoeid laten, maar alleen vervangen voor het vervangen van iets anders. Ik heb nu dit geprobeerd:

find "code \<code\>(.*?)\<"
replace "code \<code\>$1\<"

find \{\{DEFAULTSORT\:(.*?)\}\}
replace \{\{DEFAULTSORT\:$1\}\}
(Dat er twee keer code staat klopt, daarmee kan ik de string uniek identificeren). AWB triggert niet. Nu kan het zijn dat mijn regex syntax hapert, maar is dit sowieso de manier om te werken? (Het gaat over de Categorie:Regional Indicator Symbol, maar als dit werkt kan ik hier wat meer mee). Milliped (overleg) 3 okt 2021 12:58 (CEST)

Ik weet niet wat voor een taaltje dit is, maar het lijkt erop dat via de find het patroon tussen ronde haken () in een buffer $1 wordt opgeslagen. Vervolgens wordt deze buffer bij de replace gebruikt als vervangingswaarde. Gewoonlijk kan dit alleen in een en hetzelfde commando. Stel ik heb de string "a12 b12 c12" en ik wil alleen de 12 in b12 vervangen door 21 dan krijg je via het Unix/Linux commando sedL sed -e "s/\(b\)12/\121/". \( \) heeft hier dezelfde betekenis als naar ik vermoed hierboven () betekent, en idem voor \1 en $1. Als dit idd de gedachte is dan hebben de combinatie find/replace hierboven geen effect (als het al zou werken) daar de gevonden () in find door zichzelf $1 bij de replace wordt vervangen. --3 okt 2021 13:43 (CEST)
Hoi het taaltje is regex (geen idee welk dialect AWB gebruikt, ik ben ietsie bekend met PCRE). Het idee is om die buffer dus ergens anders te gebruiken. Milliped (overleg) 3 okt 2021 13:47 (CEST)
Regex (regular expressie) zegt me niets. In het voorbeeld met sed (stream editor) wordt ook 'n regex gebruikt. Al die search en replace constructies via 'n regex konden hun oorsprong wel eens in sed vinden. Waar gebruik je deze commando's? --Sb008 (overleg) 3 okt 2021 13:53 (CEST)
In AWB. In de search & replace opdracht gebruik ik de "normal settings" en vink ik regex aan. (Ik weet dus niet welk dialect regex die gebruikt). Milliped (overleg) 3 okt 2021 13:56 (CEST)
Ik gebruik in AWB de volgende regex-handleiding: en:Wikipedia:AutoWikiBrowser/Regular expression.
Mijn inschatting is dat de eerste $1 het resultaat van de eerste find oppikt, en de tweede die van de tweede. Dus: per saldo geen verandering. Maar... een zeer ervaren AWB-gebruiker ben ik nou ook weer niet. Leg het eens voor aan Edoderoo? Pommée (overleg) 3 okt 2021 14:14 (CEST)
Of aan bdijkstra  →bertux 3 okt 2021 14:33 (CEST)
(na bwc) Ik ken AWB niet dus kan je concreet niet verder helpen. (Ik heb inmiddels wel toestemming voor het gebruik van aangevraagd.) Bij een search en replace is het in zijn algemeenheid niet mogelijk om patroon x te vervangen door 'n patroon y dat pas in de toekomst (verderop in de tekst) wordt gedefinieerd. Dit kan eigenlijk alleen wanneer de tekst 2x wordt doorlopen of door de tekst achterstevoren door te lopen wanneer y per definitie na x in de tekst voorkomt. Echter de volgorde van x en y staat bij 'n willekeurig geval niet vast, dus moet de tekst eigenlijk altijd 2x worden doorlopen. In de 1e doorloop wordt de find gebruikt, waarbij het resultaat e.g. in een variabele wordt geplaatst. In de 2e doorloop gebruikt replace dan de waarde van de variabele voor de feitelijke vervangen. Standaard wordt er bij een vervanging via 'n regex geen gebruikt gemaakt van ('n) variabele(n) maar van ('n) buffer(s). Bueffers houden op te bestaan na beeindiging van een commando en kunnen niet tussen 2 commando's overgedragen worden. Het zou best kunnen dat in AWB het wel kan, omdat men 'n extra laag heeft ingebouwd om dit mogelijk te maken e.g. via variabelen. Ligt echter niet voor de hand omdat wanneer men alleen search commando's zou geven, laten we zeggen 1000 search commando's, er dan 1000 gedefinieerde variabelen zouden bestaan. Ook dit is weer op te lossen door 'n vaste variabele te gebruiken, zodat deze variabele alleen het resultaat van de laatste search bevat. Een andere manier zou kunnen zijn om de twee commando's via 'n Named pipe achtige constructie aan elkaar te koppelen. Maar het lijkt me sterk dat men bij AWB zo ver is gegaan. --Sb008 (overleg) 3 okt 2021 14:32 (CEST)
{{DEFAULTSORT}} staat altijd onderaan, alleen de categorieën staan daar nog onder, dus de volgorde is bekend  →bertux 3 okt 2021 14:36 (CEST)
Irrelevant, je moet abstracter denken en niet voor 'n specifiek voorbeeld waar defsort idd onderaan staat. Wat als ik ipv defsort de waarde van parameter "oppervlakte" in 'n infobox wil gebruiken. Zaken worden generiek en niet specifiek geimplementeerd. --Sb008 (overleg) 3 okt 2021 14:44 (CEST)
$1 heeft alleen betekenis in dezelfde zoek-en-vervangopdracht, dus je moet het in 1 doen:
find "code \<code\>([^\<\n]+)\<(.*)\{\{DEFAULTSORT\:([^\}\n]*)\}\}"
replace "code <code>$1<$2{{DEFAULTSORT:$1}}"
(Niet getest.) Wel de optie multiline aanzetten. –bdijkstra (overleg) 3 okt 2021 17:40 (CEST)
Hoi bdijkstra, dank weer voor je inzicht. Deze regel lijkt het nog niet te doen; als ik in de advanced mode test krijg ik al geen match op de find, (multiline staat aan). Ik denk wel dat het iets in deze richting moet zijn, maar misschien dat er iets mis gaat met de escapes. Milliped (overleg) 3 okt 2021 22:32 (CEST)
Nu wel getest. Je moet ook SingleLine inschakelen. –bdijkstra (overleg) 3 okt 2021 22:44 (CEST)
Hmm, het lukt me nog immer niet. Regex staat aan, MultiLine staat aan en SingleLine ook. Milliped (overleg) 4 okt 2021 21:34 (CEST)
Deed het wel. AWB Find en Replace op Normal Settings, en dan opties regex, single line, en multiline aanvinken. De door collega Gebruiker:Bdijkstra zo kundig geconstrueerde strings gebruiken, maar zonder de dubbele quotes (") aan het begin en einde van de string. Oja, en ook niet het woord find en replace in de string laten staan :-) Milliped (overleg) 10 okt 2021 17:25 (CEST)

Regex citeersjablonenripper bewerken

Hai daar, ik probeer in Notepad++ het volgende te bereiken: Ik heb een string, <ref name="foo">{{Citeer nieuws|achternaam=foo|voornaam=foo|auteurlink=foo bar|werk=[[baz]]|datum=2021-12-29|titel=qux|url=https://www.nytimes.com/2021/09/14/well/eat/seltzer-water-benefits.html}}</ref> en daar wil ik iets behapbaarders van maken, door alles wat tussen <ref name=" en |url= staat te vervangen door <blah>. Ik zou denken dat de syntax om die string te vinden dan ^<ref name="*url=$ zou moeten zijn, maar dit triggert niet. Ik zie niets dat escape codes nodig lijkt te hebben? Enig idee hoe ik dit aan de praat kan krijgen? Milliped (overleg) 29 dec 2021 12:07 (CET)

<ref name=".*?\|url Help dit op gang? Dat sterretje slaat bij jou op het aanhalingsteken, niet op elk leesteken. Dajasj (overleg) 29 dec 2021 12:16 (CET)
Bijna perfect! <ref name=".*?\|url= werkt, grote dank! Milliped (overleg) 29 dec 2021 12:38 (CET)
Oja excuus, ik had het even wat opgeschoond zodat ik het voor mezelf werkend kreeg ;) Veel succes met je project :) Dajasj (overleg) 29 dec 2021 12:40 (CET)
Ik weet niet of dat de bedoeling is, maar wanneer er 2 of meer referenties op 1 regel staan, krijg je waarschijnlijk niet het gewenste effect. Verder, ik ben niet bekend met Notepad++, maar het "?" lijkt me overbodig. --Sb008 (overleg) 29 dec 2021 14:23 (CET)
Het vraagteken zorgt er juist voor dat ie bij twee referenties alleen één referentie pakt, en niet allebei. Of heb ik het verkeerd? Dajasj (overleg) 29 dec 2021 14:25 (CET)
<ref name="[^<]*\|url= is vermoedelijk wat veiliger trouwens, ben je ook van het vraagteken af. Dajasj (overleg) 29 dec 2021 14:27 (CET)
De praktijk wees uit dat Dajasj code (mét vraagteken) prima werkte, ook met meerdere referenties op dezelfde regel. Milliped (overleg) 29 dec 2021 14:29 (CET)
Ik zou wel het punt vervangen door [^<] eigenlijk, want stel dat op ongelukkige wijze de url ontbreekt, dan voeg je wel twee referenties onbedoeld samen :) Dajasj (overleg) 29 dec 2021 14:30 (CET)
Check, dat lijkt ook te werken. Nog een vraagje, is er dan een slimme manier om de }}</ref> aan het eind in één keer mee te nemen, zodat ik in één keer naar <blah>URL</blah> kan komen? Ik loop 'm nu simpelweg nog een keer na met een simpele zoek en vervang, en dat werkt ook, maar dat kan vast mooier. Milliped (overleg) 29 dec 2021 14:44 (CET)
Kun je misschien heel kort uitleggen wat je volledige doel is van de reguliere expressie? Ik snap namelijk niet helemaal wat je bedoelt. Dan kan ik je hopelijk iets makkelijker helpen. Dajasj (overleg) 29 dec 2021 15:34 (CET)
Vooruitlopend op je reactie heb ik alvast het een en ander geprobeerd. Met (<ref name="[^<]*\|\s*url=)([^\|]*)([^<]*<\/ref>) Pak je de hele referentie, verdeeld in drie groepen (voor de url, de url en na de url). In Notepad++ kun je dan dat invullen bij Replace -> Find what. Bij Replace with kun je dan een combinatie van \1, \2, \3 invullen. Als je bijvoorbeeld \1\3 invult behoud je alles behalve de url zelf. Is dit ongeveer de oplossingsrichting die je zoekt? Dajasj (overleg) 29 dec 2021 15:51 (CET)
Even wat nagezocht en ik zie dat in Notepad++ het "?" niet dezelfde betekenis heeft als in vi(m) of emacs. Voor het overige, heeft de referentie altijd het "name" attribuut, of is zonder ook mogelijk? En moet "blah" altijd "blah" zijn of e.g. identiek aan de waarde of het name attribuut? Dus <ref name="foo">{{citeer.....|url=URL |....}}</ref> wordt <foo>URL</foo> en <ref name="oof">{{citeer.....|url=URL |....}}</ref> wordt <oof>URL</oof>. --Sb008 (overleg) 29 dec 2021 20:31 (CET)
Waar het feitelijk voor is: Als je hier onderaan bij de referenties kijkt zie je dat de vertaaltool er op meerdere vlakken behoorlijk naast zit. En dit is nog een vertaling uit het Engels, in het Frans of in het Duits is het nog veel erger. Met een citeersjablonenripper zoals we die hier nu hebben kan je bare URL's als referentie geven, en dan met tools als ReFill of zelfs gewoon de VE die normaliseren. Dus feitelijk wil ik het eerste deel gewoon een <ref> en aan het einde een </ref>. Ik vrees dat er nu wat commentaar komt dat de vertaaltool dit aan moet kunnen, maar er is een verschil tussen sollen en sein, en dan is dit een efficiënte manier om dat probleem aan te pakken, en denk ik schoner en minder gevoelig voor typefouten als je het handmatig doet. Milliped (overleg) 29 dec 2021 21:05 (CET)

──────────────────────────────────────────────────────────────────────────────────────────────────── De door Dajas beschreven regex klopt in beginsel, door met "[^<]*" en "[^>]*" ipv ".*" te werken, matchen alleen referenties waarin 'n "citeer" sjabloon in voorkomt. E.g. <ref name=foo /> of <ref name=foo2>[https://nl.wikipedia.org/ Wiki]</ref> zullen dus niet matchen. Verder vermoed ik dat er niet noodzakelijk 'n "name" attrbuut aanwezig moet zijn. Dit betekent 'n kleine aanpassing, nl <ref[^<]*\|\s*url=([^\|]*)[^<]*<\/ref> Zoals eerder opgemerkt, ik ben niet thuis in Notepad++, maar in je replace veld komt dan waarschijnlijk <ref>\1</ref>. In vi(m) of emacs werk je niet met dialoog boxen maar met commando's. En wel in de zogenaamde "command mode" herkenbaar aan de ":" prompt. Op de ":" prompt geef je dan het commando:
%s/<ref[^<]*|\s*url=\([^|]*\)[^<]*<\/ref>/<ref>\1<\/ref>/g
waarbij
%s betekent van de eerste t/m de laatste regel (%) substitueer (s). naast substitueer (s) bestaan er ook andere acties, e.g. %d verwijder (delete) de eerste t/m laatste regel. Ipv van % is 1,$ hetzelfde ($ is laatste regel). Andere ranges zijn ook mogelijk e.g. 5,12s betekent van regel 5 t/m 12 substitueer.
/zoekstring/vervangingsstring/ In rood waarop gezocht moet worden, de zoekstring en in blauw de string die in plaats komt van de te vinden string, de vervangingsstring moet komen. Deze gescheiden door "/" tekens. Hierbij kan net als in Notepad++ met buffers gewerkt worden. In Notepad++ gaat dit met "(" en ")", in vi(m) en emacs met "\(" en "\)". De searchstring mag een regex zijn en zal je in Notepad++ in je "search" dialoogveld zetten en de vervangingsstring in je "replace" dialoogveld.
g (aan het einde) staat voor "globaal". Zonder de "g" vindt de vervanging op elke regel hoogstens 1x plaats.
Vi(m) en emacs zijn editors uit de Unix (en Linux) wereld maar bestaan ook voor Windows. Notepad++ is hier ongetwijfeld van afgeleid. De Unix wereld bestaat van origine niet uit GUI's al doen deze ook steeds meer hun intrede. Alles gaat via commando's. Dit maakt het voor nieuwkomers hoogdrempelig en niet iets dat je 1-2-3 onder de knie hebt. Maar, wanneer je het eenmaal onder de knie hebt, wil je geen menu's en dialoogboxen meer zien. Maar in essentie kan je met enerzijds Notepas++ en anderzijds vi(m)/emacs hetzelfde al is de een GUI en de ander commando georienteerd en verschilt de syntax voor een regex ietwat. --Sb008 (overleg) 30 dec 2021 02:19 (CET)

Hoe erg het is: Ik beken, ik gebruikte voorheen in de Uni*es waar ik op werkte Pico. In vi kom ik net wat verder dan :q!, maar ik ben geen goeroe. Notepad++ heeft in de wondere wereld van Windows ook wel voordelen. Er zijn trouwens meer plekken waar je met regex terecht kan, zoals in WP:AWB en in de filterregels voor de proxyserver waar ik me beroepsmatig mee bezig houd. Wat betreft de uitzonderingen op het gebruik van het citeersjabloon: Die ben ik nog niet tegengekomen, ik denk dat het echt een afwijking van de vertaaltool is om die er te pas en te onpas tussen te zetten, en vaak dus ook met het gevolg dat de referenties niet meer werken. Maar dit moet sowieso semi-automatisch, je zal altijd even moeten kijken wat er precies gebeurt. Milliped (overleg) 30 dec 2021 15:11 (CET)
Dat je de noodrem (q!) kent, is vrij essentieel. --Sb008 (overleg) 30 dec 2021 18:46 (CET)