2009-03-18 9 views
2

Imaginez que les utilisateurs insèrent des chaînes dans plusieurs ordinateurs.Extraire la sous-chaîne de la chaîne avec Regex

Sur un ordinateur, le motif dans la configuration va extraire certains caractères de cette chaîne, disons les positions 4 à 5. Sur un autre ordinateur, le motif d'extraction renverra d'autres caractères, par exemple, les 3 dernières positions de la chaîne .

Ces configurations (les modèles Regex) sont différentes pour chaque ordinateur et devraient pouvoir être modifiées par l'administrateur, sans avoir à modifier le code source.

Quelques exemples:

  Original_String  Return_Value 
User1 - abcd78defg123   78 
User2 - abcd78defg123   78g1 
User3 - mm127788abcd   12 
User4 - 123456pp12asd   ppsd 

Peut-il être fait avec Regex? Merci.

+0

Pourriez-vous nous donner d'autres exemples de ce que vous essayez de faire correspondre? Est-ce que la longueur et le format varient ou sont-ils toujours 4 caractères, 2 nombres, 4 caractères et 3 nombres? –

Répondre

1

Pour avoir des valeurs de capture regex pour une utilisation ultérieure, vous utilisez habituellement(), selon le compilateur regex il pourrait être() ou pour Microsoft MSVC Je pense qu'il est []

Exemple

User4 - 123456pp12asd   ppsd 

est le plus intéressant en ce que vous avez ici 2 zones de capture séparées. Existe-t-il une règle par défaut sur la façon de les joindre, ou voudriez-vous alors pouvoir spécifier comment faire le résultat?

Peut-être quelque chose comme

r/......(..)...(..)/\1\2/ for ppsd 
r/......(..)...(..)/\2-\1/ for sd-pp 

voulez-vous lancer un regex pour obtenir les captures et les gérer vous-même, ou voulez-vous d'exécuter des commandes de manipulation plus avancées?

+0

C'est ce que je cherchais! En C#, je ne pense pas que vous puissiez spécifier comment le résultat retournera, je peux seulement appliquer ce modèle^...... (..) ... (..) $ et dans ce cas je devrai gérer chaque match.Group [x] moi-même. Merci beaucoup! –

+0

Hey, mais si vous connaissez un moyen de gérer toutes les correspondances en C#, faites le moi savoir! –

7

Pourquoi voulez-vous utiliser regex pour cela? Quel est le problème avec:

string foo = s.Substring(4,2); 
string bar = s.Substring(s.Length-3,3); 

(vous pouvez envelopper ceux à faire un peu de limites de vérification sur la longueur assez facilement)

Si vous voulez vraiment, vous pourriez l'envelopper dans un Func<string,string> à mettre quelque part - pas sûr que je dérange, cependant:

Func<string, string> get4and5 = s => s.Substring(4, 2); 
Func<string,string> getLast3 = s => s.Substring(s.Length - 3, 3); 
string value = "abcd78defg123"; 
string foo = getLast3(value); 
string bar = get4and5(value); 
+0

Je ne me suis pas expliqué. Désolé. Je veux avoir tous ces modèles dans une table qui s'applique à un cas particulier. –

+0

Je suis certain que vous pourriez penser à une syntaxe simple pour exprimer ce qui précède - [4,2] et [-3,3] par exemple (où - signifie "de la droite") –

+0

Il s'agit d'être configurable sans avoir à recompiler. –

1

Je ne suis pas sûr de ce que vous espérez obtenir en utilisant RegEx. RegEx est utilisé pour la correspondance de modèle. Si vous voulez extraire en fonction de la position, utilisez simplement la sous-chaîne.

1

Il me semble que Regex n'est vraiment pas la solution ici. Pour revenir une section d'une chaîne commençant à la position pos (à partir de 0) et de la longueur longueur, vous appelez simplement la fonction de sous-chaîne en tant que tel:

string section = str.Substring(pos, length) 
1

Groupement. Vous pouvez faire correspondre sur/^.{3}(.{2})/, puis regarder le groupe $ 1 par exemple.

La question est pourquoi? La manipulation normale des chaînes, c'est-à-dire les méthodes de sous-chaîne réelles, vont être plus rapides et plus claires dans l'intention.

3

Si vous voulez vraiment utiliser regex:

^...(..) 

Et:

.*(...)$ 
+0

. * Est inutile dans votre regex # 2. Il faut même regarder n'importe quoi avant les trois derniers caractères. – Tomalak

+0

Ce n'est pas nécessaire mais réduit le retour arrière. Maintenant, il étend la première expression ('. *') À l'ensemble de la chaîne, puis revient en arrière seulement les trois derniers caractères pour obtenir une correspondance pour l'expression entière. Sinon, il vérifierait chaque caractère si la fin est déjà atteinte. – Gumbo

+0

Votre réponse faisait partie du résultat que j'aimerais obtenir. Merci. –

Questions connexes