1
votes

Regex pour mot non entouré de caractères alphanumériques

Je veux une expression régulière correspondant à un mot spécifique qui n'est entouré d'aucun caractère alphanumérique. Ma pensée était d'inclure une négation avant et après:

myspecificword   // no match
 myspecificword  // match

Donc, cela correspondrait:

notmyspecificword
myspecificword123

Et ne correspondrait pas:

myspecificword
_myspecificword_
-myspecificword

Mais cette simple expression régulière ne correspondra pas au mot par lui-même à moins qu'il ne soit précédé d'un espace:

[^a-zA-Z\d]myspecificword[^a-zA-Z\d]

Utilisation des indicateurs " gmi "et test avec JavaScript. Qu'est-ce que je fais mal? Cela ne devrait-il pas être aussi simple que cela?

https://regex101.com / r / BCkbVQ / 3


5 commentaires

La limite du mot Regex est \ b


@Amy Cela ne fonctionnera pas car le trait de soulignement est considéré comme un caractère de mot.


Utilisez des comparaisons négatives. regular-expressions.info/lookaround.html


Cela ne fonctionne pas car [^ a-zA-Z \ d] doit correspondre à un caractère réel. Il n'y a pas de caractère au début ou à la fin.


/ (? devrait fonctionner, mais gardez à l'esprit que la recherche en arrière n'est pas prise en charge dans les anciens navigateurs.


5 Réponses :


1
votes

Ce n'est pas un espace blanc qui est requis mais tout symbole qui correspond à [^ a-zA-Z \ d] .

Vous devez utiliser: ( Démo )

(?:^|[^a-zA-Z\d])myspecificword(?:[^a-zA-Z\d]|$)

Le principal avantage est la prise en charge de tous les analyseurs Regexp.


3 commentaires

Les Lookarounds seraient plus efficaces qu'une alternance AFAIK.


@Akxe, Une explication de la raison pour laquelle cela fonctionne améliorerait votre réponse.


@JithinPavithran meilleure explication vous donnera le regexr.com , lié dans la réponse dans l'onglet "expliquer". C'est une explication interactive de ce qu'est l'expression rationnelle.



3
votes

Essayez d'utiliser:

(?<![^\s_-])myspecificword(?![^\s_-])

Ceci dit de faire correspondre myspecificword quand il est entouré, des deux côtés, soit du début / fin de l'entrée, d'un espace, d'un trait de soulignement ou un tiret.

Démo


10 commentaires

La recherche positive et négative est inutilement coûteuse, mieux utiliser le début et la fin de la ligne


@Akxe Pas vrai du tout, et ma réponse est plus efficace que votre réponse.


Oh, mes excuses alors, quel était le problème alors? Compatibilité? Je me souviens avoir évité de l'utiliser ...


Idgaf sur la compatibilité, cela est censé fonctionner sur un seul serveur. J'apprécie cependant la performance.


J'adore les doubles négatifs. Mais puisque l'OP a dit, "pas entouré de caractères alphanumériques", alors probablement (myspecifword) est acceptable. Alors pourquoi pas: (? ?


J'apprécie les réponses, mais quelqu'un pourrait-il m'éclairer sur les raisons pour lesquelles mon regex ne fonctionnera pas?


@GRoutar Lisez le commentaire posté sur votre question par Barmar il y a 18 minutes.


@GRoutar Le problème avec votre modèle est qu'il n'autorise pas les correspondances qui ont le début et / ou la fin de l'entrée comme limite.


Très bien merci pour l'aide, cela fonctionne comme prévu.


Cette expression rationnelle n'entraînera-t-elle pas un temps exponentiel?



-1
votes

Je pense que cela fonctionnera:

/[^a-z0-9ITED?myspesificword[^a-z0-9ITED?/i


6 commentaires

votre regex utilise [^ a-zA-Z0-9] qui indique que doit être entouré de caractères non alphanumériques, ajoutez ? donc c'est facultatif


Mais cela correspondra également à ceux AVEC des caractères alphanumériques qui l'entourent, tels que amyspesificwordz .


Essayez ceci / ([^ a-z0-9]? Myspesificword [^ a-z0-9]?) / I


@Illya: Je pense que vous voudrez peut-être relire la question. Ceci recherche quelque chose qui correspondra à des chaînes telles que "myspecificword", "_myspecificword_" ou "-myspecificword" et ne correspondra pas à celles telles que "notmyspecificword" ou " myspecificword123 ".


/ ^ ([^ a-z0-9] * myspesificword [^ a-z0-9] *) $ / i comme ça?


Argh, mon mauvais, je pense que cela correspondra à myspesificword sur un long texte



0
votes

Si vous voulez vraiment dire "non entouré par des caractères alphanumériques autres que _ (et dans votre tentative d'expression régulière, vous semblez vouloir faire correspondre tout ce qui n'est pas une lettre ou un chiffre), alors l'un des ce qui suit devrait être acceptable:

let tests = ['myspecificword',
             '_myspecificword_',
             ' myspecificword ', 
             '-myspecificword-', 
             '(myspecificword)', 
             'amyspecificword',
             '1myspecificword'
             ];
let regex = /(?<![^_\W])myspecificword(?![^_\W])/;
for (let test of tests) {
    console.log(regex.test(test));
}

Et l'expression régulière devrait être:

(?<![^_\W])myspecificword(?![^_\W])

'myspecificword'
'_myspecificword_'
' myspecificword '
'-myspecificword-'
'(myspecificword)'

La réponse "acceptée" ne correspondra pas à (myspecificword) , par exemple.


0 commentaires

0
votes

Le titre de cette question est

Regex pour mot non entouré de caractères alphanumériques

Les autres réponses ont toutes abordé une question différente (qui pourrait bien être celle voulue):

Regex pour mot ni précédé ni suivi de caractères alphanumériques

Je ferai référence à ces déclarations comme n ° 1 et n ° 2 respectivement.

Si le mot spécifié était 'cat' et la chaîne était '9cat' , 'cat' n'est pas entouré de caractères alphanumériques dans la chaîne, il y a donc une correspondance avec # 1, mais pas avec # 2.

Pour # 1, on pourrait utiliser l'expression régulière:

/(?<!\p{Alpha}cat(?!\p{Alnum})/

("match 'cat' non suivi d'un caractère alphanumérique Unicode ou 'cat' not précédé d'un caractère alphanumérique Unicode "), bien qu'il soit plus facile de tester la négation:

/(?<=\p{Alpha}cat(?<=\p{Alnum})/

Le test réussit si la chaîne ne correspond pas à cette expression régulière.

Avec l'interprétation n ° 2, l'expression régulière est:

/cat(?!\p{Alpha}|(?<!\p{Alnum})cat/


0 commentaires