Hmm ... Selon la version exacte de Regex que vous utilisez, considère:
(?P<id>\d{3})(?=[A-Za-z\s]{16}\d)(?P<username>[A-Za-z]{8,16})\s*(?P<phone>\d{8})
note 100% que cela fonctionne, et je l'ai utilisé l'évasion des espaces caractère au lieu d'une réelle space - Je deviens nerveux avec juste le caractère spatial, mais vous voudrez peut-être être plus restrictif.
Voir si cela fonctionne. Je suis seulement intermédiaire avec RegEx moi-même, donc je pourrais être dans l'erreur.
Vérifiez la syntaxe des groupes nommés pour votre version de RegEx a) existe et b) correspond à la norme que j'ai utilisée ci-dessus.
EDIT:
Juste pour développer ce que je suis en train de faire (désolé de faire vos yeux saignent, Pax!) Pour ceux sans beaucoup d'expérience RegEx:
(?P<id>\d{3})
Cela va essayer pour correspondre à un groupe de capture nommé - 'id' - c'est trois chiffres de longueur. La plupart des versions de RegEx vous permettent d'utiliser des groupes de capture nommés pour extraire les valeurs que vous avez comparées. Cela vous permet de faire la validation et la capture de données en même temps. Différentes versions de RegEx ont des syntaxes légèrement différentes pour cela - consultez http://www.regular-expressions.info/named.html pour plus de détails concernant votre implémentation particulière.
(?=[A-Za-z\s]{16}\d)
Le? = Est un opérateur de recherche anticipée. Cela regarde vers l'avant pour les seize caractères suivants, et retournera vrai s'ils sont tous des lettres ou des caractères d'espace ET sont suivis par un chiffre. L'opérateur lookahead a une longueur nulle, donc il ne retourne rien. Votre chaîne RegEx continue à partir du point que Lookahead a commencé. Consultez http://www.regular-expressions.info/lookaround.html pour plus de détails sur lookahead.
(?P<username>[A-Za-z]{8,16})\s*
Si le passe préanalyse, nous continuons à compter du quatrième caractère. Nous voulons trouver huit à seize caractères, suivi par un ou plusieurs espaces blancs. Le 'ou plus' est en fait sûr, car nous avons déjà fait en sorte qu'il n'y ait pas plus de seize caractères au total avant le prochain chiffre.
Enfin,
(?P<phone>\d{8})
Cela devrait vérifier le numéro de téléphone à huit chiffres. Je suis un peu nerveux que cela ne fonctionne pas exactement - votre version de RegEx peut ne pas supporter la syntaxe de groupe nommé ou la syntaxe lookahead que je suis habitué.
Je suis aussi un peu nerveux que cette Regex réussisse à correspondre à une chaîne vide. Les différentes versions de Regex gèrent différemment les chaînes vides.
Vous pouvez également envisager d'ancrer cette Regex entre un^et un $ pour vous assurer que vous correspondez à toute la ligne, et pas seulement à une partie d'une ligne plus grande.
En effet. La première chose à laquelle vous pensez en face d'un problème est «Je sais, j'utiliserai des expressions régulières». Maintenant, vous avez deux problèmes. –
Je raisonne que je l'ai demandé, c'est qu'il semble 'être résoluble par une simple regex . Faites en sorte que ce ne soit pas si simple. Je suis d'accord pour une approche plus simple au lieu d'une longue regex. – jackysee