1
votes

Expression régulière qui doit avoir au moins une lettre

J'ai un cas où j'utilise une file d'expressions régulières pour filtrer des éléments spécifiques dans un modèle Observer. Le filtre placera les valeurs dans des contrôles spécifiques en fonction de leurs valeurs. Cependant, l'un des modèles de contrôle est qu'il peut accepter TOUT caractère ASCII. Permettez-moi de lister les filtres dans leur ordre avec le RegEx

Column         Rule                        Regex
Receiving     7 DIGITS                     @"^[1-9]([0-9]{6}$)"   --->Works
Count         2 digits, no leading 0       @"^[1-9]([0-9]{0,1})$" --->Works
Producer      any ASCII char.              @".*"                  --->too broad
              MUST contain a letter

Y a-t-il une expression régulière qui acceptera n'importe quel jeu de caractères ASCII, mais 1 d'entre eux DOIT être une lettre (majuscule ou minuscule) ? @ "^ (? =. * [A-Za-z]) $" -> N'a pas fonctionné

exemples qui devraient entrer dans l'expression

  • 123 rouge
  • rouge
  • 123 rouge123
  • rouge - 123

red


0 commentaires

3 Réponses :


0
votes

Que diriez-vous ^. * [a-zA-Z] +. * $ ?

Entre le début et la fin de la ligne, acceptez n'importe quel nombre de caractères quelconques, puis au moins un caractère a-z / A-Z, puis à nouveau n'importe quel nombre de caractères quelconques.


4 commentaires

Cela devrait fonctionner. Sauf, techniquement, pour répondre à la question du PO, vous n'avez pas besoin du "+". Cela correspondra à une série d'au moins une lettre, mais nous nous soucions seulement qu'il y ait une seule lettre.


[A-z] correspond à plus que de simples lettres, cela ne peut pas fonctionner. Cela ne fonctionnera pas non plus avec une chaîne contenant une nouvelle ligne (un caractère ASCII).


@ WiktorStribiżew oups, une faute de frappe (la plage A-z).


Pourtant, . * correspond à toutes les unités de code Unicode du plan BMP.



0
votes

Vous pouvez essayer [A-Za-z] + .

Il correspond lorsqu'il y a au moins une lettre. Vous voulez quelque chose de plus spécifique?


0 commentaires

3
votes

Si vous voulez faire correspondre toute la plage de caractères ASCII, vous pouvez utiliser

@"^(?=[^A-Za-z]*[A-Za-z])[ -~]*$"

Si seuls les caractères imprimables sont autorisés, utilisez

@"^(?=[^A-Za-z]*[A-Za-z])[\x00-\x7F]*$"

Notez que l'attaque positive (? = [^ A-Za-z] * [A-Za-z]) est située juste après ^ , c'est-à-dire qu'elle est uniquement déclenché au début d'une chaîne. Il nécessite une lettre ASCII après un ou plusieurs caractères autres qu'une lettre ASCII.

Votre modèle ^ (? =. * [A-Za-z]) $ ne l'a pas fait travailler parce que vous vouliez faire correspondre une chaîne vide ( ^ $ ) qui contient (? = ...) au moins une lettre ASCII ( [A-Za- z] ) après plus de 0 caractères autres que le saut de ligne (. * ).


0 commentaires