2015-04-18 17:16:31 +0000 2015-04-18 17:16:31 +0000
20
20

Hoe moet ik een regex schrijven die past bij een bepaald woord?

Ik heb geprobeerd om een specifieke regex aan het werk te krijgen, maar ik kan het niet laten doen wat ik nodig heb.

In principe wil ik dat het op zoek gaat naar ROCKET. De regex moet overeenkomen met ROCKET in hoofdletters of kleine letters, en met of zonder leestekens, maar niet als onderdeel van een ander woord. Dus, de regex zou op elk van deze:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

triggeren maar NIET op ROCKET als het gevonden wordt in iets als

Rocketeer
Sprocket

Ik heb geprobeerd om het goed te krijgen met behulp van een regex generator online, maar ik kan het niet precies laten overeenkomen met ROCKET.

Antwoorden (4)

11
11
11
2015-04-18 17:32:40 +0000

Ik stel voor om de MSDN Regular Expression Quick Reference

te bookmarken. U wilt een geval-gevoelige match voor het woord “raket”, omgeven door niet-alphanumerieke tekens. Een regex die zou werken zou zijn:

\W*((?i)rocket(?-i))\W*

Wat het zou doen is zoeken naar nul of meer (*) niet-alphanumerieke (\W) karakters, gevolgd door een hoofdletterloze versie van raket (?i)raket (?-i) ), gevolgd door opnieuw nul of meer (*) niet-alphanumerieke karakters (\W). De extra haakjes rond de raketmatchterm wijst de match toe aan een aparte groep. Het woord raket zal dus in matchgroep 1 staan.

UPDATE 1: Matt zei in de opmerking dat deze regex in python gebruikt moet worden. Python heeft een iets andere syntaxis. Om hetzelfde resultaat in python te bereiken, gebruikt u deze regex en geeft u de optie re.IGNORECASE door aan de functie compile of match.

\W*(rocket)\W*

Op Regex101 kan dit gesimuleerd worden door in het tekstvak naast de regex-invoer “i” in te voeren.

UPDATE 2 Ismael heeft vermeld, dat de regex niet helemaal juist is, omdat deze misschien overeenkomt met “1rocket1”. Hij heeft een veel betere oplossing gepost, namelijk

(?:^|\W)rocket(?:$|\W)

10
10
10
2015-04-19 06:17:43 +0000

Ik denk dat de look-aheads in dit geval overkill zijn, en je kunt beter woordgrenzen gebruiken met de ignorecase optie,

\brocket\b

Met andere woorden, in python:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I) # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']
1
1
1
2015-04-19 04:00:42 +0000

Met grep en sed kun je \<rocket\>.&nbsp gebruiken; Met grep maakt de -i optie het hoofdlettergevoelig ( i gnore geval):

grep -i '\<rocket\>'

Ik weet geen enkele manier om alle sed regexes hoofdlettergevoelig te maken, maar er is altijd de holbewonerswijze:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
0
0
0
2019-11-23 10:06:05 +0000

Gebruik de optie Alleen zoeken naar hele woorden.

Voor zover het leestekens betreft, kun je deze pas beantwoorden als je de smaak/smaak kent.

Het is een zeer oude draad, dus gepost voor iemand die misschien later op bezoek komt met een behoefte. Degenen die de draad hebben voortgebracht zijn misschien naar iets anders verhuisd… Nee?