7
votes

Regex pour extraire le premier numéro de 6 à 10 chiffres, à l'exclusion des nombres de 8 chiffres

J'ai les noms de fichiers de test ci-dessous: xxx

J'ai besoin d'extraire un numéro à partir de chaque nom de fichier.

Le nombre doit être 6, 7, 9 ou 10 chiffres long (donc, excluant les numéros à 8 chiffres).

Je veux obtenir le premier numéro , si plus d'un est trouvé, ou une chaîne vide si aucune ne se trouve.

J'ai réussi à le faire dans un processus 2 étapes , enlevez d'abord les numéros à 8 chiffres, puis extrayez les numéros de 6 à 10 chiffres de ma liste. xxx

Les chiffres que je reçois après ce processus de 2 étapes sont exactement ce que je recherche: xxx

maintenant, La question est: y a-t-il un moyen de le faire dans un processus d'une étape?

J'ai vu Cette belle solution à une question similaire, cependant, cela me donne le dernier numéro si plus d'un trouvé.

Remarque: Test avec L'entraîneur Regex .


1 commentaires

Spécifier votre langue de programmation serait utile.


4 Réponses :


8
votes

En supposant que votre moteur Regex prend en charge les assertions de Lookbehind: xxx pré>

Explication: strong> p>

(?<!\d)   # Assert that the previous character (if any) isn't a digit
\d{6}     # Match 6 digits
(?:       # Either match
 \d?      # 0 or 1 digits
|         # or
 \d{3,4}  # 3 or 4 digits
)         # End of alternation
(?!\d)    # Assert that the next character (if any) isn't a digit


1 commentaires

Merci, tim! Cela résout le problème. Merci pour l'explication aussi. J'ai fini par utiliser une version modifiée de votre solution, car il y avait des cas où je devais extraire une plage ou un deuxième numéro, ou les deux, mais la pièce que vous avez fournie est intacte. :)



0
votes

Essayez ceci:

regex: /(?:^|\D)(\d{6}(?:\d(?:\d{2,3})?)?)(?:\D|$)/
replacement: \1


0 commentaires

0
votes

Pour chaque chaîne $ Sujet

$subject = "abc001_20111104_summary_123.txt";
$subject ="abc008_200700953_timeline.txt";
$subject ="abc008_20080402_summary200201573unitf.txt";
$subject ="123456.txt"
$subject ="100101-100102 test.txt"
$subject ="abc008_20110902_summary200110254.txt";
$subject ="abcd 200601141 summary.txt";
$subject ="abc008_summary_200502169_xyz.txt";

$pattern = '*(?<!\d)(\d{6,7}|\d{9,10})(?!\d)*';
preg_match_all($pattern, $subject, $matches);
print_r($matches);
  • vide li>
  • 200700953 LI>
  • 200201573 LI>
  • 123456 LI>
  • 100101 LI>
  • 200110254 LI>
  • 200601141 LI>
  • 200502169 LI> ul> p>


0 commentaires

0
votes

correspondant à des limites de mot ou non au bord du bord de [0-9] {6,7} | [0-9] {9,10} code> devrait le faire:

([^0-9]|\<)([0-9]{6,7}|[0-9]{9,10})([^0-9]|\>)


0 commentaires