Les expressions régulières et des caractères spéciaux

Les expressions régulières en javascript ont une forme courte spéciale et la syntaxe PCRE standard.

Ils travaillent à travers un RegExp objet spécial.

En outre, les lignes ont leurs propres méthodes de recherche, match, remplacer, mais pour les comprendre - analyser la même première RegExp.

Le type d'objet RegExp, ou, en bref, l' expression régulière, vous pouvez créer un double sens

/ motif / drapeaux
new RegExp ( "motif" [, drapeaux])

motif - l'expression régulière pour rechercher (le remplacement - plus tard), et les drapeaux - une chaîne de toute combinaison de symboles g (recherche globale), i (insensible à la casse) et m (recherche multiligne).

La première méthode est fréquemment utilisée, la seconde - parfois. Par exemple, ces deux appels sont équivalentes:

var reg = / ab + c / i
var reg = new RegExp ( "ab + c", "i")

Sur le deuxième appel - tk expression régulière entre guillemets, il est nécessaire de dupliquer le \

// équivalent
re = new RegExp ( "\\ w +")
re = / \ w + /

Lors de la recherche, vous pouvez utiliser la plupart des fonctionnalités de PCRE syntaxe moderne.

Masquer / Afficher la table

symbole sens
\ Pour les caractères ordinaires - qui les rend spécial. Par exemple, l'expression / s / est à la recherche d'un symbole de 's'. Et si vous mettez un \ devant s, puis / \ s / stands déjà pour les espaces simvol.I Inversement, si un caractère spécial, tel que *, il \ , il sera tout simplement le symbole d' habitude "star". Par exemple, / a * / recherche 'a' 0 ou plusieurs caractères consécutifs. Pour trouver une étoile 'a *' - mettre un \ avant la spéciale. symbole: / a \ * /.
^ Cela indique le début des données d'entrée. Si la recherche multiligne drapeau ( "m"), il travaille également au début d'une nouvelle stroki.Naprimer, / ^ A / ne trouve pas 'A' dans un «A», mais trouve le premier 'A' dans "An A."
$ Il indique la fin de l'entrée. Si le drapeau multi-recherche est également déclenché à la fin de stroki.Naprimer, / t $ / ne trouve pas 't' dans «mangeur», mais trouve - dans "manger".
* 0 indique répéter une ou plusieurs fois. Par exemple, / bo * / sera «boooo» dans «Un fantôme booooed» et «b» dans «Un oiseau gazouillait", mais n'a pas trouvé dans "Une chèvre grogna".
+ Indique une répétition 1 ou plusieurs fois. Equivalent à {1}. Par exemple, / a + / find 'a' dans "candy" et tous les «a» dans «caaaaaaandy».
? Elle indique que l'élément peut être présent ou absent. Par exemple, / e? Le? / Find 'el' en «ange» et «le» dans «angle». Si elle est utilisée immédiatement après l' un des quantificateurs *, + ,? , Ou {}, il définit "non gourmand" recherche (nombre minimum possible répétition de fois à l'autre motif d'élément le plus proche), par opposition au mode "gourmand" par défaut, dans lequel le nombre de répétitions que possible, même si l'élément suivant du motif, trop podhodit.Krome ,? est utilisée dans l'aperçu qui est décrit dans le tableau ci - dessous (=?) et (?) (?).
. (Point décimal) représente tout caractère sauf newline: \ n \ r \ u2028 ou \ u2029. (Vous pouvez utiliser [\ s \ S] pour rechercher tout caractère, y compris les nouvelles lignes). Par exemple, /.n/ trouver «un» et «sur» dans le «non, une pomme est sur l' arbre», mais pas «non».
(X) Trouver x et magasins. Ceci est appelé "supports de stockage." Par exemple, / (foo) / trouver et se souvient de 'foo' dans "foo bar." La chaîne correspondante est stockée dans le tableau, résultat de la recherche ou les propriétés d'un objet RegExp prédéfini: $ 1, ..., 9 $ .En outre, les supports sont combinés qu'ils contiennent, dans un seul élément du motif. Par exemple, (abc) * - abc répétition de 0 ou plus.
(? X) Finds de x, mais ne se souvient pas trouvé. Ceci est connu comme «crochets immémoriaux». La chaîne correspondante ne sont pas stockées dans les résultats du tableau et les propriétés RegExp.Kak et toutes les tranches, situé unir en un seul podpattern.
x (? = y) Trouve x, si seulement pour x implique y. Par exemple, / Jack (? = Sprat) / trouver 'Jack', que si elle est suivie par «Sprat». / Jack (= Sprat |? Givre ) / trouver 'Jack', si seulement pour être suivie par «Sprat» ou «gel». Cependant, ni «Sprat» ni «Frost 'ne sera pas inclus dans les résultats de recherche.
(Y!) X Trouve x, si seulement pour x ne devrait pas y. Par exemple, /\d+(?!\.)/ trouver le numéro que si non suivie d'un point décimal suivi. /\d+(?!\.)/.exec("3.141 ") 141 va, mais pas 3.141.
x | y Trouver x ou y. Par exemple, / vert | rouge / trouver «verte» dans la «pomme verte» et «rouge» dans la «pomme rouge."
{N} Où n - nombre entier positif. Trouve exactement n répétitions de l'élément précédent. Par exemple, / a {2} / trouve 'a' dans "candy" , mais sera à la fois d'un "caandy," et les deux premiers dans un "caaandy."
{N} Où n - nombre entier positif. Trouve n répétitions ou plus de l'élément. Par exemple, / a {2} ne trouve pas 'a' dans "candy", mais trouve tout 'a' dans "caandy" et "caaaaaaandy."
{N, m} N et m - entiers positifs. N pour trouver m répétitions de l'élément.
[Xyz] Jeu de caractères. Il trouve l'un des personnages. Vous pouvez spécifier la période d'utilisation des tirets. Par exemple, [abcd] - le même que [ad]. Cela se trouve le «b» dans «poitrine», et le «a» et «c» dans «douleur».
[^ Xyz] Tout caractère sauf ceux de l'ensemble. Vous pouvez également spécifier l'intervalle. Par exemple, [^ abc] - le même que [ac ^]. Cela se trouve le «r» dans «poitrine» et «h» dans «chop».
[\ B] Trouve caractère backspace. (Ne pas confondre avec \ b.)
\ b Trouve mots limite (latin), comme un espace. (Ne pas confondre avec [\ b]). Par exemple, / \ bn \ w / trouver «non» dans «midi»; / \ Wy \ b / sera «ly» dans «peut - être hier."
\ B Il indique aucune limite de mot. Par exemple, / \ w \ Bn / trouve 'sur' dans «midi», et / y \ B \ w / trouver «vous» dans «peut - être hier."
\ C X X - lettre de A à Z. Indique un caractère de contrôle dans une chaîne. Par exemple, / \ cM / désigne le caractère Ctrl-M.
\ d trouve un certain nombre de caractères (nous avons le même Unicode). Isplzuetsya [0-9], pour ne rechercher que les chiffres habituels. Par exemple, / \ d / ou / [0-9] / find '2' dans "B2 est le numéro de série."
\ D Trouver caractère non-numérique (alphabets). [^ 0-9] - équivalent à des nombres ordinaires. Par exemple, / \ D / ou / [^ 0-9] / trouver «B» dans «B2 est le numéro de série."
\ F, \ r \ n caractères spéciaux appropriés de saut, saut de ligne, saut de ligne.
\ s Ceci trouvera tout espace blanc, y compris les espaces, les onglets, les sauts de ligne et autres espaces Unicode. Par exemple, / \ s \ w * / find 'bar' dans "foo bar."
\ S Cela trouvera tout caractère sauf espace. Par exemple, / \ S \ w * / sera 'foo' dans "foo bar."
\ t Le caractère de tabulation.
\ v caractère de tabulation verticale.
\ w Ceci trouvera tous les caractères verbaux (alphabet latin), y compris les lettres, chiffres et caractères de soulignement. Equivalent à [A-Za-z0-9_]. Par exemple, / \ w / find 'a' dans la "pomme" , "5" dans "5,28 $" et "3" dans le "3D".
\ W Cela trouver non (lat.) Un symbole verbal. Equivalent à [^ A-Za-z0-9_] . Par exemple, / \ W / et / [^ $ A-Za- z0-9 _] / semblables trouveront '%' dans "50%."
\ n n - un nombre entier. Pour retourner aux crochets mémorisés sous-chaîne n-ième. Par exemple, / pomme (,) \ sorange \ 1 / sera «pomme, orange, 'en" pomme, orange, cerise, pêche . ". Sur la table il y a un exemple plus complet.
\ 0 Va trouver un caractère NUL. Ne pas ajouter à la fin des autres figures.
\ x hh Va trouver le personnage avec les hh de code (deux chiffres hexadécimaux)
\ U hhhh Trouvera le caractère avec hhhh de code (quatre chiffres hexadécimaux).

Pour vérifier simplement si la chaîne correspond à l'expression régulière, en utilisant la méthode d'essai:

if (/\s/.test("stroka ")) {
... Dans la ligne il y a des lacunes! ...
}

méthode Exec retourne un tableau et définit les propriétés d'une expression régulière.
S'il n'y a pas de correspondance, elle renvoie null.

Par exemple,

// Find one-d, suivie d'une ou plusieurs B, qui est l' un des d
// Rappelez - vous point b, et de les suivre d
// Recherche Insensible
var myRe = / j (b + ) (d) / ig;
var myArray = myRe.exec ( "cdbBdbsbz" );

À la suite de l'exécution du script seront les résultats suivants:

objet Propriété / Index description exemple
myArray Le contenu de myArray. [ "DbBd", "BB" , "d"]
index Adaptation d'indice (0) 1
contribution La chaîne d'origine. cdbBdbsbz
[0] Les derniers caractères correspondants dbBd
[1], ... [n] Matches entre parenthèses imbriquées, le cas échéant. Le nombre de parenthèses imbriquées ne sont pas limités. [1] = bB
[2] = d
myRe lastIndex L'indice à partir duquel commencer la recherche suivante. 5
ignoreCase Indique que la recherche insensible à la casse a été inclus, drapeau "i". vrai
global Indique que le drapeau a été inclus "g" trouver tous les matches. vrai
multiligne Affiche, était un multi-recherche drapeau est activé si "m". faux
source Le texte du motif. j (b +) (d)

Si le drapeau "g" est inclus dans une expression régulière, vous pouvez appeler la méthode exec plusieurs fois pour trouver des correspondances successives dans la même ligne. Lorsque vous faites cela, la recherche commence à la chaîne de str, avec l'indice lastIndex. Par exemple, voici un script comme ceci:

var myRe = / ab * / g ;
var str = "abbcdefabh";
tandis que ((myArray = myRe.exec (str ))! = null) {
var msg = "Found" + myArray [ 0] + ".";
msg + = "Prochain match commence à " + myRe.lastIndex;
print (msg);
}

Ce script affiche le texte suivant:

abb Trouvé. Prochain match commence à 3
Trouvé ab. Prochain match commence à 9

Dans l'exemple suivant, la fonction recherche pour l'entrée. Ensuite, faites une boucle à travers le réseau pour voir s'il y a d'autres noms.

Il est supposé que tous les noms sont enregistrés dans le tableau A:

var A = [ "Frank", "Emily", "Jane", "Harry", "Nick", "Beth", "Rick",
"Terrence", "Carol", "Ann", "Terry", "Frank", "Alice", "Rick",
"Bill", "Tom", "Fiona", "Jane", "William", "Joan", "Beth"];

la fonction recherche (entrée)
{
var firstName = /\w+/i.exec(input);
if (! firstName)
{
print (entrée + "est pas un nom!");
retour;
}

count var = 0;
for (var i = 0; i <a.length; i ++)
{
if (firstName [0] .tolowercase () == A [i ] .tolowercase ())
compter ++;
}
var midstring = (count == 1)? "Autre a": " d' autres ont ";
print ( "Merci," + count + midstring + "du même nom!")
}

Les méthodes suivantes pour travailler avec des expressions régulières à partir de chaînes.

Toutes les méthodes, sauf remplacer, vous pouvez appeler en tant qu'objets de type regexp dans les arguments, et avec des cordes qui sont convertis en objets machine à RegExp.

Donc, il est équivalent à appeler:

var i = str.search (/ \ s /) var i = str.search ( "\\ s")

Lorsque vous utilisez des guillemets pour dupliquer \ et vous ne pouvez pas spécifier les drapeaux, il est donc parfois forme commode et complète

var i = str.search (new RegExp ( "\\ s", "g"))

Il renvoie l'index de l'expression régulière dans la chaîne, ou -1.

Si vous voulez savoir si la chaîne correspond à l'expression régulière, utilisez la recherche de la méthode (similaire à tester RegExp-méthodes). Pour plus d' informations, utilisez le match de méthode plus lente (la même méthode de RegExp exec).

Cet exemple imprime le message, selon que la chaîne correspond à l'expression régulière.

fonction testinput (re, str) {
if (str.search (re)! = -1)
midstring = "contient";
autre
midstring = "ne contient pas";
document.write (str + midstring + re.source) ;
}

Si regexp est pas l'indicateur g, renvoie le même résultat que RegExp.exec (string).

Si le regexp l'indicateur g, il retourne un tableau avec toutes les coïncidences.

Pour trouver simplement si la chaîne correspond à l'expression régulière de l'expression rationnelle, utilisez RegExp.test (string).

Si vous voulez obtenir le premier résultat - essayez r egexp.exec (string).

Dans l'exemple suivant, match est utilisé pour trouver le "chapitre", suivi d'un ou plusieurs chiffres, puis les nombres séparés par un point. Dans l'expression régulière est le drapeau i, de sorte que le registre sera ignoré.

str = "Pour plus d' informations, voir le chapitre 3.4.5.1";
re = / chapitre (\ d. + (\ \ d) *) / i;
trouvées = str.match (re);
alert (trouvé);

Le script donnera le tableau des matches:

  • Chapitre 3.4.5.1 - ligne entièrement correspondance
  • 3.4.5.1 - la première tranche
  • .1 - Support interne

L'exemple suivant illustre l'utilisation de drapeaux et insensible match de recherche globale. Toutes les lettres seront trouvées de A à E et a à e, chacun - dans un élément séparé de la matrice.

var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var regexp = / [AE] / gi;
var correspond = str.match (regexp);
document.write (matchs);
// Correspond = [ 'A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']

remplacer la méthode peut remplacer les occurrences d'une expression régulière, non seulement sur la ligne, mais aussi sur le résultat de la fonction. Sa syntaxe complète - est la suivante:

var nouvelleChaine = str.replace (regexp / substr , newSubStr / fonction)
regexp
L'objet RegExp. Son entrée sera remplacée par une valeur qui renvoie le numéro de paramètre 2
substr
Une chaîne qui sera remplacé par newSubStr.
newSubStr
String qui remplace la chaîne à partir d'un certain nombre d'arguments 1.
fonction
Une fonction qui peut être appelée pour générer une nouvelle chaîne (à substituer au lieu d'une chaîne obtenue à partir d'un argument 1).

Remplacer la méthode ne change pas la chaîne, qui est appelée, mais retourne simplement une nouvelle chaîne modifiée.

Pour faire un changement global, inclure "g" dans le drapeau de l' expression régulière.

Si le premier argument - chaîne, il est pas converti en une expression régulière, de sorte que, par exemple,

var ab = "ab" .replace ( "\\ s", "..") // = "ab"

Appel remplacer la chaîne gauche inchangée, car il ne cherche pas une expression régulière \ s, et la chaîne "\ s".

La chaîne de remplacement peut être certains caractères spéciaux:

motif Inserts
$$ Insère un "$".
$ & Insère une sous-chaîne trouvée.
`$ Insérez un morceau de ficelle qui précède l'entrée correspondante.
$ ' Inserts de la ligne, qui se trouve après l'accident.
N $ ou nn $ n ou nn - chiffres décimaux, insère les occurrences de sous - chaîne n - ième parenthèse imbriquée mémorisé, si le premier argument - l'objet RegExp.

Si vous spécifiez un second paramètre à la fonction, il est valable pour chaque match.

En fonction, vous pouvez générer dynamiquement et retourner une chaîne de substitution.

Le premier paramètre de la fonction - chaîne correspondante. Si le premier argument à remplacer est un objet RegExp, les n paramètres suivants contiennent la correspondance entre parenthèses imbriquées. Les deux derniers paramètres - la position dans la ligne où le match a eu lieu et la chaîne elle-même.

Par exemple, l'appel suivant sera de retour remplacer XXzzzz - XX, zzzz.

fonction succédané (str, p1, p2 , offset, s)
{
retour str + "-" + p1 + "," + p2;
}
var nouvelleChaine = "XXzzzz" .replace ( / (X *) (z *) /, succédané)

Comme vous pouvez le voir, il y a deux crochets dans l'expression régulière, et donc deux paramètres p1, fonction p2.
S'il y avait trois tranches, la fonction devrait ajouter le paramètre p3.

La fonction suivante remplace borderTop taper les mots sur le border-top:

fonction styleHyphenFormat (propertyName)
{
fonction upperToHyphenLower (jeu)
{
retour '-' + match.toLowerCase () ;
}
retour propertyName.replace (/ [AZ] / , upperToHyphenLower);
}

Pour une compréhension générale des expressions régulières, vous pouvez consulter l' article dans le wikipedia .

Plus de détails sont décrits dans le livre (Eng.) Début, expressions régulières .