Pourquoi les regex pour le match 1 à 10 écrit que [1-9]|10 [1-10]?
Pourquoi l'expression régulière pour rechercher des numéros de 1 à 10 qui s'écrit comme suit?
[1-9]|10
Au lieu de:
[1-10]
Ou ceci:
[1-(10)]
Il s'agit d'un caractère gamme et pas un plage. Fondamentalement, vous le lire comme un nombre, mais regex se lit comme un simple caractère.
[1-10]
correspondent à une 1
ou un 0
et rien d'autre.OriginalL'auteur Baumr | 2013-06-27
Vous devez vous connecter pour publier un commentaire.
Parfois, un bon dessin vaut 1000 mots...
Voici les trois propositions de votre question et de la façon dont une regex saveur serait de comprendre:
[1-9]|10
[1-10]
[1-(10)]
Cette regex est invalide en raison d'une gamme est ouvert (
1-
) avec un chiffre, mais pas fermé avec un autre chiffre (qui se termine avec(
).Une gamme est généralement lié avec des chiffres sur les deux côtés ou lettres sur les deux côtés.
Voir ma mise à jour
Je sais que c'est l'âge de 4 ans, mais aussi de corriger certaines informations:
10|[1-9]
a le plus de chances de capot de réussir certaines versions de regex évaluer la OU les déclarations de commande et correspondent à la première résultat correct, de sorte que la valeur10
peut saisir uniquement les1
de la10
pas le nombre entier.aussi, la gamme dans le dernier regex n'est pas valide car le deuxième personnage n'est pas un chiffre, c'est parce que l'ASCII / unicode indice de
(
est inférieure à celle de1
, et vous ne pouvez pas spécifier des plages dans l'ordre décroissant des indices.OriginalL'auteur Stephan
C'est parce que regexes travailler avec les personnages, pas avec des chiffres.
[1-9]
est équivalent à(?:1|2|3|4|5|6|7|8|9)
tout[1-10]
serait(?:1|0)
(parce que c'est la gamme de 1-1 et le chiffre 0).Tout simplement, des plages dans les classes de caractères, reportez-vous toujours à contigus des plages de caractères, en dépit de la façon dont ils regardent. Même si elles sont des chiffres qui ne veut pas dire qu'il n'y est aucune sorte de plage numérique.
[1-(10)]
ne marcherait pas?Parce que la regex ne pas reconnaître les chiffres, il reconnaît chiffres et de caractères. Ainsi, même si nous, en tant que les êtres humains reconnaissent que 10 est le nombre après le 9, la regex n'a pas de notion de qui; tout ce qu'ils connaissent sont les chiffres de 0 à 9. En tant que tel, '10' n'est pas un nombre dans la regex, c'est une séquence de chiffres composé de deux chiffres 1 et 0.
Parce que ce serait encore considérer seulement les caractères individuels, et, donc, essayer (et l'échec) pour générer une plage de caractères à partir de
1-(
.OriginalL'auteur Joey
:
[1-9]
accepte tout caractère de 1 à 9;|
effectue un "ou" l'opération;10
accepte le 10 littéralement.Ce accepte:
0
.Merci pour la mise en forme et l'amélioration de la lisibilité
Merci pour la fixation de ma faute de frappe 😉
OriginalL'auteur JoseTeixeira
N'importe quel motif est à l'intérieur de
[...]
(classe de caractères), il ne correspond à une unique caractère.La façon dont la gamme de l'opérateur (
-
) à l'intérieur de la classe de personnage fonctionne est qu'il faut un caractère unique comme opérande de gauche, et un seul caractère comme opérande de droite, puis de l'étendre à une liste de caractères.Donc, en regardant les plages dans vos exemples
1-9
(1 à 9) dans[1-9]|10
(équivalent à[123456789]|10
)1-1
(1 à 1) dans[1-10]
(équivalent à[10]
qui est le même que[01]
)1-(
(1 à l'ouverture de la parenthèse) dans[1-(10)]
1
à(
n'a pas vraiment de sens.OriginalL'auteur doubleDown
Il regex
[1-9]
est un équivalent deune regex classe de personnage qui correspond à un caractère unique. Lorsque vous mettez un tiret dans sa définition, comme dans
b-e
, la classe est élargi pour inclure les extrémités (c'est à direb
ete
) avec tous les personnages avec des points de code entre les deux extrémités (c'est à direc
etd
). Les deux extrémités peuvent être les mêmes, comme dans1-1
, auquel cas l'expression est équivalente à1
.C'est pourquoi
[1-10]
est fonctionnellement équivalent à0|1
.OriginalL'auteur dasblinkenlight
C'est sur le caractère de correspondance. Quand vous dites
[1-9]
cela signifie qu'il correspond à tous les caractères individuels de 1 à 9. Numéro 10 seraient traités comme des 2 caractères.OriginalL'auteur Sachin Shanbhag
La
[]
indique un caractère unique matchpar exemple
[ab]
concordancea
oub
donc
[1-9]
qui est en fait un raccourci pour[123456789]
correspondent à un caractère unique qui est l'un des chiffres de1
à9
Votre exemple de
[1-10]
permettrait d'élargir le 1-1 à dire tous les caractères dans la plage1
à1
(j'.e1
) donc la regex serait d'élargir l'être [10] (c'est à dire soit le chiffre 1 ou le caractère 0)OriginalL'auteur Bob Vale
Qui est la définition de base d'une classe de caractères.
[1-10]
signifie "correspond à un caractère dans la plage de 1 à 1, ou 0". Les classes de caractères sont évalués caractère par caractère (sauf pour les séquences d'échappement et-
); ils ne comprennent pas des nombres.OriginalL'auteur Niet the Dark Absol
C'est parce que la
[]
symboles représentent jeu de caractères, par exemple[0-5]
de rapprochement de 0 à 5 ans. Cependant, 10 a deux chiffres et, par conséquent,[0-9]
ne produira pas une correspondance exacte (ne correspond au premier chiffre, '1' de '10'.Le symbole de canal
|
peut être vu comme un opérateur "ou".C'est plus comme un opérateur "ou". "et" implique que vous devez faire correspondre les deux en même temps, qui ne peuvent pas vraiment se produire.
Mon mauvais. Je corrige la position des mains.
OriginalL'auteur Terry
Cela permettra d'éliminer de Wikipédia références lorsque vous copiez quelque chose pour votre projet.
OriginalL'auteur user9781012