3 votes

Le Javascript RegExp peut-il faire une insensibilité partielle à la casse ?

Je voudrais savoir si Javascript RegExp a la possibilité d'activer ou de désactiver l'insensibilité à la casse dans l'expression régulière elle-même. Je sais que vous pouvez définir le modificateur pour l'ensemble de l'expression régulière, mais ce n'est pas ce dont je parle.

Par exemple, ma chaîne de recherche pourrait être :
teXT To seArcH TOP SECRET .

Je veux trouver la partie insensible à la casse "texte à rechercher" et ensuite forcer la sensibilité à la casse pour "TOP SECRET".

Ainsi, cela ne correspondrait pas (en raison de la sensibilité des majuscules et des minuscules pour les documents top secret) :
teXT To seArcH Top Secret

mais ceci correspondrait (la casse de la première section n'a pas d'importance) :
text to search TOP SECRET

En Perl, vous pouvez le faire dans la chaîne de recherche. Le moteur d'expressions régulières de Javascript supporte-t-il quelque chose de ce genre ?

4voto

Paul S. Points 20115

Vous pouvez écrire la RegExp en respectant la casse en "longhand".

/[tT][eE][xX][tT] [tT][oO] [sS][eE][aA][rR][cC][hH] TOP SECRET/
    .test('text to search TOP SECRET');
// true

Une autre approche consiste à utiliser deux expressions régulières, une insensible et une stricte.

function test(str) {
    var m = str.match(/text to search (TOP SECRET)/i);
    return (m || false) && /TOP SECRET$/.test(m[1]);
}

test('text to search TOP SECRET'); // true
test('text to search ToP SECRET'); // false

En outre, la fonction test ci-dessus peut être optimisée dans ce cas précis (puisque l'option TOP SECRET est effectivement un littéral de chaîne de caractères qui aura toujours exactement la même forme), il n'est pas nécessaire d'ajouter une deuxième partie complète de RegExp pour le vérifier, c'est-à-dire que vous pouvez faire

(m || false) && 'TOP SECRET' === m[1];

3voto

dystroy Points 145126

Ce que vous pouvez faire est de construire votre regex comme ceci :

var str = "teXT To seArch";
var r = new RegExp(
  str.split('').map(function(c){return '['+c.toLowerCase()+c.toUpperCase()+']'}).join('')
  + ' TOP SECRET'
);

3voto

GOTO 0 Points 3049

Selon cette page de référence , Javascript supporte :

Aucun modificateur de mode pour définir les options de correspondance dans le cadre de l'expression régulière régulière.

La réponse est donc non, vous ne pouvez pas activer ou désactiver la sensibilité à la casse dans une expression régulière.

2voto

svidgen Points 4012

Je ne pense pas. Je vous suggère de faire ça :

var m;
var str = "teXT To seArcH TOP SECRET";
if ((m = str.match(/text to search (top secret)/i)) && m[1].match(/TOP SECRET/)) {
  // matched.
}

0voto

Alex Wayne Points 58113

Pourquoi ne pas simplement utiliser 2 Regex ?

var str = "teXT To seArcH TOP SECRET";
if (/text to search/i.test(str) && /TOP SECRET/.test(str)) {
  console.log('match!');
}

Je pense qu'il y a rarement une bonne raison de faire une seule Regex très complexe pour couvrir tous les cas, alors que vous pourriez plutôt faire une poignée de Regex que vous combinez avec la logique du code. Je préfère de loin avoir des Regex de petite taille du point de vue de la maintenance, car comprendre ce que fait une Regex complexe peut être assez décourageant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X