2010-12-23 3 views
3

Je vais avoir les cordes possibles suivantes:Regex Motif Aide

12_3

ou

+ 14_1 + 12_3 16_3-400_2

Les chiffres pourraient être différents, mais ce que je suis Vous recherchez les modèles numériques X_X. Cependant, je dois faire un remplacement qui cherchera 2_3 et PAS retourner le 12_3 comme une correspondance valide.

Les +/- sont des symboles d'arthrite et peuvent avoir n'importe quelle valeur valide. Ils ont aussi besoin d'ARENT (dans l'exemple du premier) .. donc, je pourrais vouloir vérifier une chaîne qui a juste 12_3, et si je passe en 2_3, cela ne retournerait PAS une correspondance. Seulement si je suis passé en 12_3.

Ceci est pour un script C#.

Un grand merci pour toute aide !! Je suis regex stupide.

+2

Je ne comprends pas la pléthore de «questions» qui ne sont rien de plus que des demandes pour que nous fassions votre travail pour vous.Il y a un grand nombre de façons d'apprendre les expressions régulières en lisant de grands livres comme Mastering Regular Expressions ou des logiciels tels que RegEx Buddy. D'une manière ou d'une autre, il n'y a aucune excuse pour poser une question d'expressions régulières sans montrer les expressions que vous avez essayées de créer en premier. –

+0

@Frazell - Ceci est la cinquième question de cet utilisateur, et sa première question regex. Si vous pensez qu'il y a un problème général, lancez une question sur [meta] (http://meta.stackoverflow.com/), mais il s'agit essentiellement de bruit ici. – Kobi

Répondre

2

Ok, nous avons, à savoir: + 2_3 + 14_1 + 12_3 16_3-400_2 + 2_3

regexp # 1:

Regex r1 = new Regex(@"\d+(\d_\d)"); 
MatchCollection mc = r1.Matches(sourcestring); 

Résultats trouvés:

[0] [0 ] = 12_3 [0] [1] = 2_3

[1] [0] = 14_1 [1] [1] = 4_1

[2] [0] = 16_3 [2] [1] = 6_3

[3] [0] = 400_2 [3] [1] = 0_2

regexp # 2:

Regex r2 = new Regex(@"\d+\d_\d"); 
MatchCollection mc = r2.Matches(sourcestring); 

Matches Found:

[0] [0] = 12_3

[1] [0] = 14_1

[2] [0] = 16_3

[3] [0] = 400_2

est que ce que vous cherchez?

+0

Merci pour ça! J'ai eu un modèle similaire à votre deuxième, mais je ne pouvais pas comprendre si j'avais besoin de faire plusieurs modèles basés sur le nombre de chiffres sur le côté gauche et droite de la _ .. Très utile! – dpluscc

2

\b\d+_\d+\b.

\d est un chiffre et \b est une limite de mot de largeur nulle. Voir ce C# regex cheat sheet.

MISE À JOUR: Je viens de regarder un « C# regex feuille de triche » pour vérifier que \b était une limite de mot (il est \< et \> grep). C'était le premier résultat. Je n'ai pas vérifié le texte. Quoi qu'il en soit, je suis maintenant lié à une autre feuille de triche.

+0

Voyez, je sais ce que je recherche .. Donc, par exemple, je sais que dans ma chaîne je vais chercher 2_3 .. Donc quand j'utilise le motif \ b2_3, il trouve le bon "2_3" dans la chaîne 12_3 + 2_3 + 122_3 .. Je ne comprends pas vraiment pourquoi? :) – dpluscc

+0

"Correspond à la position entre un caractère de mot" .. Je devine qu'il voit 12_3 comme un mot, et le + comme un délimiteur? – dpluscc

+2

Ne vous occupez pas de cette feuille de triche. '\ b' correspond à une position qui est soit suivie d'un caractère de mot et non précédée d'un (début de mot), soit précédée d'un caractère de mot et non suivie d'une (fin de mot). L'autre caractère (s'il y en a un) peut être un espace, une ponctuation ou tout caractère qui n'est pas un "caractère de mot" (c'est-à-dire une lettre ou un chiffre, ou une ponctuation de connexion comme le trait de soulignement). '\ b2_3' ne correspond pas à' 12_3' car '\ b' devrait correspondre entre les deux caractères,' 1' et '2'. –