C #: DETERMINATION si la chaîne est comme ce modèle; possible regex

voix
2

Considérons une chaîne qui ressemble à ceci:

RR1 S5 C92

Cette adresse de route rurale pour hors-ville livraison du courrier: Route rurale, Site, compartiment. Chaque lettre est suivie d'un numéro et un espace. Habituellement, un à trois chiffres, mais on ne sait jamais combien de chiffres, il pourrait être! Si l'utilisateur est paresseux, ils peuvent être entrés à zéro, un ou plusieurs espaces.

Question: Quelle regex utiliseriez-vous pour déterminer si une chaîne donnée correspond à ce modèle?

Son utilisation serait quelque chose comme ceci:

string ruralPattern; //a regex pattern here
bool isRural = Regex.Match(someString, ruralPattern);

Mise à jour: Merci pour vos suggestions! Performances et l' utilisation seront dans une méthode statique dans un ensemble à appeler à partir d' un service Web. Les cordes sont vérifiées par rapport à ce modèle sera maximum de 50 caractères. La méthode sera appelée à peu près une fois toutes les 5 secondes. Toutes les suggestions sur le garder statique? Très appréciée!

Créé 26/08/2009 à 23:11
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
9

Cela devrait fonctionner:

^[Rr][Rr]\d+ *[Ss]\d+ *[Cc]\d+$

ou par un autre commentaire

^[Rr][Rr][0-9]+ *[Ss][0-9]+ *[Cc][0-9]+$

Qu'est-ce que cela signifie:

  • ^ - début de la chaîne
  • [Rr] - le caractère suivant doit être un R ou r
  • [Rr] - le caractère suivant doit être un R ou r
  • \ D + ou [0-9] + - partie suivante doit être de 1 ou plusieurs chiffres
  • (Espace) * - permettre 0 ou plusieurs espaces
  • [Ss] - le caractère suivant doit être un S ou s
  • \ D + ou [0-9] + - partie suivante doit être de 1 ou plusieurs chiffres
  • (Espace) * - permettre 0 ou plusieurs espaces
  • [Cc] - le caractère suivant doit être un C ou c
  • \ D + ou [0-9] + - partie suivante doit être de 1 ou plusieurs chiffres
  • $ - fin de la chaîne

Il pourrait y avoir une solution plus élégante, mais cela est assez facile à lire.

Edit: Mise à jour pour inclure l' entrée de certains des commentaires

Créé 26/08/2009 à 23:12
source utilisateur

voix
3

Que diriez-vous...

someString = someString.Trim(); // eliminate leading/trailing whitespace
bool isRural = Regex.Match(
   someString,
   @"^rr\d+\s*s\d+\s*c\d+$",
   RegexOptions.IgnoreCase);

Ceci élimine la majuscule / minuscule de commutation dans le motif et utilise \spour permettre à tous les caractères (non-retour à la ligne) des espaces (par exemple des pattes). Si vous voulez des espaces seulement, puis '\s'devrait être remplacé ' '.

Créé 27/08/2009 à 00:03
source utilisateur

voix
1

Éclaircissons les présomptions suivantes:

  1. Il trois sections à la chaîne.
  2. section 1 toujours commencer par en majuscules ou en minuscules RR et se termine par un ou plusieurs chiffres décimaux.
  3. section 2 commence toujours avec majuscule ou en minuscule S et se termine par un ou plusieurs chiffres décimaux.
  4. section 3 commence toujours avec C supérieure ou inférieure et se termine par un ou plusieurs chiffres décimaux.

Par souci de simplicité, ce qui suit suffirait.

[Rr][Rr][0-9]+[ ]+[Ss][0-9]+[ ]+[Cc][0-9]+
  1. [Rr] signifie exactement un alphabet R, majuscule ou minuscule.
  2. [0-9] signifie exactement un chiffre décimal.
  3. [0-9] + désigne au moins un, ou plus, de chiffres décimaux.
  4. [] + Désigne au moins un, ou plusieurs, des espaces.

Cependant, pour être utile, normalement, lorsque vous utilisez regex, nous détecter également des sections individuelles d'exploiter la capacité de mise en correspondance pour nous aider à attribuer des valeurs des sections individuelles à leurs variables respectives / individuelles.

Par conséquent, l'expression rationnelle suivante est plus utile.

([Rr][Rr][0-9]+)[ ]+([Ss][0-9]+)[ ]+([Cc][0-9]+)

Appliquons que regex à la chaîne

string inputstr = "Holy Cow RR12 S53 C21";

C'est ce que votre matcher regex vous permettra de savoir:

start pos=9, end pos=21
Group(0) = Rr12 S53 C21
Group(1) = Rr12
Group(2) = S53
Group(3) = C21

Il y a trois paires de crochets elliptiques / rondes. Chaque paire est une partie de la chaîne, que le compilateur appelle regex un groupe.

Le compilateur regex appellerait le match

  1. l'ensemble de chaîne mise en correspondance en tant que groupe 0
  2. route rurale comme groupe 1
  3. le site dans le groupe 2 et
  4. un compartiment dans le groupe 3.

Bien entendu, les groupes 1, 2 et 3 rencontreront matches, si et seulement si le groupe 0 a un match.

Par conséquent, votre algorithme exploiterait que le pseudo-code suivant

string postalstr, rroute, site, compart;
if (match.group(0)!=null)
{
  int start = match.start(0);
  int end = match.end(0);
  postalstr = inputstr.substring(start, end);

  start = match.start(1);
  end = match.end(1);
  rroute = inputstr.substring(start, end);

  start = match.start(2);
  end = match.end(2);
  site = inputstr.substring(start, end);

  start = match.start(3);
  end = match.end(3);
  compart = inputstr.substring(start, end);
}

De plus, vous pouvez entrer dans une table de base de données avec les colonnes: rr, site, Compart, mais vous voulez que les chiffres sont entrés sans alphabets « rr », « s » ou « c ». Ce serait le regex avec groupement imbriqué à utiliser.

([Rr][Rr]([0-9]+))[ ]+([Ss]([0-9]+))[ ]+([Cc]([0-9]+))

Et le matcher vous permettra de savoir ce qui suit quand un match se produit pour le groupe 0:

start=9, end=21
Group(0) = Rr12 S53 C21
Group(1) = Rr12
Group(2) = 12
Group(3) = S53
Group(4) = 53
Group(5) = C21
Group(6) = 21
Créé 27/08/2009 à 01:54
source utilisateur

voix
0

Pour votre information: Si vous allez utiliser ce RegEx pour tester un grand nombre de données, votre meilleur pari serait de dire .NET précompiler - il sera compilé dans IL et d'accorder un coup de pouce de la performance, plutôt que d'interpréter simplement l'expression rationnelle motif à chaque fois. Spécifiez comme un membre statique selon classe contient votre méthode, comme suit:

private static Regex re = new Regex("pattern", RegexOptions.Compiled | RegexOptions.IgnoreCase);

... et la méthode pour tester si une chaîne correspond au modèle est ...

bool matchesString = re.IsMatch("string");

Bonne chance.

Créé 27/08/2009 à 03:08
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more