Regex pour position fixe et de la longueur de champ
Je suis en train de travailler sur une regex extraire exact de caractères à partir d'un mainframe ligne de journal, avec une largeur fixe l'espacement (...regex n'est pas mon point fort, BTW).
Je veux extraire les valeurs de champ d'un champ d'État, qui est la zone de longueur fixe qui contient le SUCCESSFUL AUDIT
, LOGON COMPLETE
, et FINAL FAILED AUDIT
valeurs indiquées dans l'échantillon des événements ci-dessous.
Il y a beaucoup de valeurs de cette zone de longueur fixe, donc je ne peux pas vraiment extraire de la chaîne des valeurs comme j'ai essayé de faire.
Au lieu de cela, je voudrais extraire de tous les personnages qui commencent à la position 54 de l'événement et la longueur est exactement 18 caractères.
De l'aide ou des idées au sujet de la regex ou la méthode, etc, serait grandement apprécié.
528 LOGON 39690 SECURITY LAPTOP 8481 USER AB11 SUCCESSFUL AUDIT BBB908AFB 06/20/12 09:11:43PM
528 LOGON 39692 SECURITY LAPTOP 8495 USER AB11 LOGON COMPLETE BBB908AFB 06/20/12 09:12:12PM
528 LOGOFF 39699 SECURITY DESKTOP 4476 USER ABEQ FINAL FAILED AUDITAADAFCC01 06/20/12 09:55:49PM
- a) avez-vous besoin d'utiliser un langage spécifique? Si oui, merci d'ajouter la balise et de le mentionner. b) Est-il prévu qu'il n'y a pas d'espace après
FINAL FAILED AUDIT
? c) quel est le champ d'état de la dernière ligne commence à la même position que les deux premiers?LOGOFF
etDESKTOP
sont à la fois un caractère de plus queLOGON
etLAPTOP
, respectivement. Impression à l'exemple des chaînes de code au lieu d'un bloc de citation doit montrer plus clairement.
Vous devez vous connecter pour publier un commentaire.
De considérer les éléments suivants powershell exemple universelle d'une regex.
.{53}(.{18})
Exemple
Rendements
Résumé
.{53}
saute sur les 53 premiers caractères (notez que la première position dans la chaîne est égale à zéro)(.{18})
recherche et renvoie le 18 caractère large champfaire quelques petites chaîne de traitement.
Si la regex est toujours nécessaire, c'est un point de départ ( bien que dans votre propre entrée de numéros 54 et 18 ne correspondent pas à ce que vous voulez comme réponse, j'ai donc essayé avec 47 16 au lieu de cela, vous pouvez modifier comme vous voulez) :
(?<=[a-zA-Z0-9 ]{47})([a-zA-Z0-9 ]{16})
http://regexr.com?328dm