Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

RegExp : méthode [Symbol.search]()

Baseline
Large disponibilité

Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis septembre 2016.

La méthode [Symbol.search]() des instances de RegExp définit comment String.prototype.search() doit se comporter.

Exemple interactif

class RegExp1 extends RegExp {
  constructor(str) {
    super(str);
    this.pattern = str;
  }
  [Symbol.search](str) {
    return str.indexOf(this.pattern);
  }
}

console.log("table football".search(new RegExp1("foo")));
// Résultat attendu : 6

Syntaxe

js
regexp[Symbol.search](str)

Paramètres

str

Une chaîne de caractères (String) sur laquelle on veut rechercher une correspondance.

Valeur de retour

L'index de la première correspondance entre l'expression rationnelle et la chaîne de caractères donnée, ou -1 si aucune correspondance n'a été trouvée.

Description

Cette méthode existe pour personnaliser le comportement de la recherche dans les sous-classes de RegExp. Elle est appelée en interne dans String.prototype.search(). Par exemple, les deux exemples suivants retournent le même résultat.

js
"abc".search(/a/);

/a/[Symbol.search]("abc");

[Symbol.search]() appelle toujours exactement une fois la méthode exec() de l'expression rationnelle, et retourne la propriété index du résultat, ou -1 si le résultat est null. L'indicateur g n'a aucun effet avec cette méthode.

Cette méthode ne copie pas l'expression rationnelle, contrairement à [Symbol.split]() ou [Symbol.matchAll](). Cependant, contrairement à [Symbol.match]() ou [Symbol.replace](), elle définit toujours lastIndex à 0 au début de l'exécution et le restaure à la valeur précédente à la fin, évitant ainsi généralement les effets secondaires. Cela signifie qu'elle retourne toujours la première correspondance dans la chaîne de caractères même lorsque lastIndex est non nul, et que les expressions rationnelles adhérentes recherchent toujours strictement au début de la chaîne de caractères.

js
const re = /[abc]/g;
re.lastIndex = 2;
console.log("abc".search(re)); // 0

const re2 = /[bc]/y;
re2.lastIndex = 1;
console.log("abc".search(re2)); // -1
console.log("abc".match(re2)); // [ 'b' ]

Exemples

Appel direct

Cette méthode peut être utilisée de manière presque identique à String.prototype.search(), à l'exception du this différent et de l'ordre des arguments différent.

js
const re = /-/g;
const chaine = "2016-01-02";
const resultat = re[Symbol.search](chaine);
console.log(resultat); // 4

Utiliser [Symbol.search]() dans les sous-classes

Les sous-classes de RegExp peuvent redéfinir la méthode [Symbol.search]() pour modifier le comportement.

js
class MaRegExp extends RegExp {
  constructor(chaine) {
    super(chaine);
    this.pattern = chaine;
  }
  [Symbol.search](chaine) {
    return chaine.indexOf(this.pattern);
  }
}

const re = new MaRegExp("a+b");
const chaine = "ab a+b";
const resultat = chaine.search(re); // String.prototype.search appelle re[Symbol.search]().
console.log(resultat); // 3

Spécifications

Spécification
ECMAScript® 2027 Language Specification
# sec-regexp.prototype-%symbol.search%

Compatibilité des navigateurs

Voir aussi