J'ai les noms de fichiers de test ci-dessous: J'ai besoin d'extraire un numéro fort> à partir de chaque nom de fichier. P> Le nombre doit être 6, 7, 9 ou 10 chiffres forts> long (donc, excluant les numéros forts> à 8 chiffres). p> Je veux obtenir le premier numéro strong>, si plus d'un est trouvé, ou une chaîne vide si aucune ne se trouve. p> J'ai réussi à le faire dans un processus Les chiffres que je reçois après ce processus de 2 étapes sont exactement ce que je recherche: p> maintenant, La question est:
J'ai vu Cette belle solution à une question similaire, cependant, cela me donne le dernier numéro si plus d'un trouvé. P>
4 Réponses :
En supposant que votre moteur Regex prend en charge les assertions de Lookbehind: 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
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. :)
Essayez ceci:
regex: /(?:^|\D)(\d{6}(?:\d(?:\d{2,3})?)?)(?:\D|$)/
replacement: \1
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);
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]|\>)
Spécifier votre langue de programmation serait utile.