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?
5 Réponses :
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.
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.
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.
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?
Je pense que cela fonctionnera:
/[^a-z0-9ITED?myspesificword[^a-z0-9ITED?/i
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
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.
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/
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.