2010-09-11 4 views
1

J'ai deux chaînes dont j'ai besoin pour extraire des données, mais je n'arrive pas à les faire fonctionner. Je voudrais savoir l'expression régulière mais malheureusement je ne le fais pas. J'ai lu quelques tutoriels débutants mais je n'arrive pas à trouver une expression qui fera ce dont j'ai besoin.Comment puis-je utiliser regex pour résoudre ce problème?

En dehors de cette première chaîne délimitée par le caractère égal, j'ai besoin d'ignorer les 6 premiers caractères et de saisir les 9 caractères suivants. Après le personnage égal, j'ai besoin de saisir les 4 premiers caractères qui sont un jour et une année. Enfin pour cette chaîne, j'ai besoin des nombres restants qui sont une date dans YYYYmmdd.

636014034657089=130719889904 

La deuxième chaîne semble un peu plus difficile, car les espaces entre les caractères diffèrent, mais semblent toujours être délimité par au minimum, un seul espace. Parfois, il y a 15 ou 20 espaces séparant les blocs de données.

Voici deux échantillons différents qui montrent la différence d'espace.

!!92519 C 01 M600200BLNBRN D55420090205M1O 

!!95815  A    M511195BRNBRN   D62520070906 ":%/]Q2#0*& 

Les données que j'ai besoin de ces deux dernières chaînes sont:

The zip code following the 2 exclamation marks. 
The single letter 'M' following that. It always appears to be in a 13 character block 
The 3 numbers after the single letter 
The next 3 numbers which are the person's height 
The following next 3 are the person's weight 
The next 3 are eye color 
The next block of 3 which are the person's hair color 

Le dernier bloc que j'ai besoin de données à partir de:

Je dois obtenir la seule lettre qui, dans le l'exemple semble être un 'D'. Passer les 3 prochains numéros Les derniers et autres 8 chiffres qui est une date dans aaaaMMjj

Si quelqu'un pouvait me aider à résoudre, je serais très reconnaissant.

+1

Quel langage de programmation utilisez-vous? Toutes les langues n'ont pas la même syntaxe pour regex. – newbie

+1

question est étiquetée PHP – nico

Répondre

2

Pour la première chaîne que vous pouvez utiliser cette expression régulière:

^[0-9]{6}([0-9]{9})=([0-9]{4})([0-9]{4})([0-9]{2})([0-9]{2})$ 

Explication:

 
^   Start of string/line 
[0-9]{6} Match the first 6 digits 
([0-9]{9}) Capture the next 9 digits 
=   Match an equals sign 
([0-9]{4}) Capture the "day and year" (what format is this in?) 
([0-9]{4}) Capture the year 
([0-9]{2}) Capture the month 
([0-9]{2}) Capture the date 
$   End of string/line 

Pour la seconde:

^!!([0-9]{5}) +.*? +M([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2}) 

Rubular

travail Il s d'une manière similaire à la première. Vous devrez peut-être l'ajuster légèrement si vos données ne sont pas exactement au format attendu par l'expression régulière. Vous voudrez peut-être remplacer le .*? par quelque chose de plus précis, mais je ne suis pas sûr car vous n'avez pas décrit le format des parties qui ne vous intéressent pas.

+0

Merci Mark. Je vais essayer ça maintenant. – Jim

+1

@Jim - utilise un groupe de capture. – TrueWill

+0

Mark, La deuxième regex ne correspond à rien du tout. Je reçois une erreur de compilation. 'Compilation échouée: rien à répéter à l'offset 45' – Jim

Questions connexes