Reguliere uitdrukking die overeenkomt met een woord of zijn voorvoegsel

Ik wil een reguliere expressie koppelen aan een heel woord.

In het volgende voorbeeld probeer ik sof seasonte matchen, maar wat ik heb komt overeen met s, e, A, oen n.

[s|season]

Hoe maak ik een reguliere expressie die overeenkomt met een heel woord?


Antwoord 1, autoriteit 100%

Vierkante haakjes zijn bedoeld voor tekenklassen en u probeert eigenlijk een van de volgende te matchen: s, |, s( nogmaals), e, A, s(opnieuw), oen n.

Gebruik in plaats daarvan haakjes om te groeperen:

(s|season)

of niet-vastleggende groep:

(?:s|season)

Opmerking: niet-capture-groepen vertellen de engine dat deze de match niet hoeft op te slaan, terwijl de andere (capturing-groep dat wel doet). Voor kleine dingen, of het werkt, voor ‘zware’ dingen, wil je misschien eerst zien of je de match nodig hebt of niet. Als u dat niet doet, kunt u beter de niet-vastleggroep gebruiken om meer geheugen toe te wijzen voor berekeningen in plaats van iets op te slaan dat u nooit hoeft te gebruiken.


Antwoord 2, autoriteit 89%

Gebruik dit live online voorbeeld om je patroon te testen:

Bovenstaande screenshot uit dit live voorbeeld: https://regex101.com/r/cU5lC2/1

Overeenkomen met elk heel woord op de opdrachtregel.

Ik gebruik de phpsh interactieve shellop Ubuntu 12.10om de PCRE regex-enginete demonstreren a>via de methode die bekend staat als preg_match

Start phpsh, plaats wat inhoud in een variabele, match op woord.

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

De preg_match-methode gebruikte de PCRE-engine binnen de PHP-taal om variabelen te analyseren: $content1, $content2en $content3met de (\w)+patroon.

$content1 en $content2 bevatten ten minste één woord, $content3 niet.

Overeenkomen met een specifiek woord op de commandoregel zonder woordbeloningen

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(dart|fart)', $gun1);
1

php> echo preg_match('(dart|fart)', $gun2);
1

php> echo preg_match('(dart|fart)', $gun3);
1

php> echo preg_match('(dart|fart)', $gun4);
0

Variabelen gun1en gun2bevatten de tekenreeks dartof fartdie correct is, maar gun3 bevat dartyen nog steeds overeenkomsten, dat is het probleem. Dus op naar het volgende voorbeeld.

Overeenkomen met specifieke woorden op de commandoregel met woordgrenzen:

Woordgrenzen kunnen geforceerd worden gekoppeld aan \b, zie:

Regex Visual Image verkregen van http://jex.im/regulexen https://github.com/JexCheng/regulexVoorbeeld:

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

De \bbeweert dat we een woordgrens hebben, en zorgt ervoor dat “dart” overeenkomt, maar “darty” niet.


Antwoord 3, autoriteit 3%

Ik test voorbeelden in js.
Eenvoudigste oplossing – voeg gewoon het woord toe dat u nodig hebt / /:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

Als je dit specifieke woord met grenzen nodig hebt, niet binnen andere tekens-letters. We gebruiken bmarkering:

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

We hebben ook de methode exec() in js, die object-resultaat retourneert. Het helpt f.g. om informatie te krijgen over plaats/index van ons woord.

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

Als we alle overeenkomende woorden in string/zin/tekst nodig hebben, kunnen we g-modifier gebruiken (global match):

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

Nu de laatste – ik heb niet 1 specifiek woord nodig, maar enkele. We gebruiken | teken, het betekent keuze/of.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1

Antwoord 4

[ ]definieert een tekenklasse. Dus elk teken dat je daar instelt, komt overeen. [012]komt overeen met 0of 1of 2en [0-2]gedraagt zich hetzelfde.

Wat u wilt, zijn groeperingen om een or-statement te definiëren. Gebruik (s|season)voor je probleem.

Btw. je moet oppassen. Metakarakters in normale regex (of binnen een groepering) verschillen van karakterklasse. Een karakterklasse is als een subtaal. [$A]komt alleen overeen met $of A, niets anders. Je kunt hier niet ontsnappen voor de dollar.

Other episodes