1

以下はテキストファイルです。正規表現を使用して、後に始まる証明書を保存したいと思います

"crossCertificatePair;バイナリ::"

これは新しい証明書の始まりを象徴し、最後まで実行されます。各ファイルには同じ方法で始まる複数の証明書があり、それぞれを抽出して変数に保存する方法が必要です。

># extended LDIF
#
# LDAPv3
># base <cn=Federal Bridge CA,ou=FPKI,o=U.S. Government,c=US> with scope subtree
># filter: (objectclass=*)
># requesting: crossCertificatePair
>#

># Federal Bridge CA, FPKI, U.S. Government, US
dn: cn=Federal Bridge CA,ou=FPKI,o=U.S. Government,c=US
crossCertificatePair;binary:: MIINq6CCB2IwggdeMIIGRqADAgECAhAEBsw2n1386M2IP4F9
 Y9f9MA0GCSqGSIb3DQEBCwUAMGQxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxG
 TAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIzAhBgNVBAMTGkRpZ2lDZXJ0IEZlZGVyYXRlZCBJRC
 BDQS0xMB4XDTExMTIwNzEyMDAwMFoXDTE0MTIwNzEyMDAwMFowUjELMAkGA1UEBhMCVVMxGDAWBgN
 VBAoTD1UuUy4gR292ZXJubWVudDENMAsGA1UECxMERlBLSTEaMBgGA1UEAxMRRmVkZXJhbCBCcmlk
 Z2UgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5M26e4VUSlib2braFWKYhaUs3Q
 SR9JwuQQHZQTmuhTOQScPO7g/JAdNvTFymOIHnXrinkPmOG+YyqxQQemNdIq3yi5AAUt+I6VOhsfS
 NhZTZJsSKoNsZ72TxqOVkLMvKWNyZxvcZK3bG1wx5eErtKqlRMjTovxGXwVktB4/J+iu975SIxT1m
 IaNsNWtyQOUF3T4P7K8/u1VwPmZ2SjMNYjKnFQU7E0Vfo1OEGWUrR0KrSBUT2Vu6PSj2OwkGr5ep6
 rr+2vjboHpWG64qOoBQHyGwd7u6f/2TPkoD5OOqGdKOD4byifwi4L5arausnxY+Yy7jMM+ifG1qKD
 GgupMJjAgMBAAGjggQcMIIEGDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjB8BggrBg
 EFBQcBAQRwMG4wJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBGBggrBgEFBQc
 wAoY6aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL2FpYURpZ2lDZXJ0RmVkZXJhdGVkSURDQS0x
 LnA3YzCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R
 mVkZXJhdGVkSURDQS0xLmNybDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZX
 J0RmVkZXJhdGVkSURDQS0xLmNybDCBowYDVR0gBIGbMIGYMAwGCmCGSAGG/WwEAQEwDAYKYIZIAYb
 9bAQBAjALBglghkgBhv1sBAIwDAYKYIZIAYb9bAQDATAMBgpghkgBhv1sBAMCMAwGCmCGSAGG/WwE
 BAEwDAYKYIZIAYb9bAQEAjAMBgpghkgBhv1sBAUBMAwGCmCGSAGG/WwEBQIwDAYKYIZIAYb9bAQFA
 zALBglghkgBhv1sAQswggEpBgNVHSEEggEgMIIBHDAYBgpghkgBhv1sBAEBBgpghkgBZQMCAQMBMB
 gGCmCGSAGG/WwEAQIGCmCGSAFlAwIBAwEwFwYJYIZIAYb9bAQCBgpghkgBZQMCAQMCMBgGCmCGSAG
 G/WwEAwEGCmCGSAFlAwIBAwMwGAYKYIZIAYb9bAQDAgYKYIZIAWUDAgEDDjAYBgpghkgBhv1sBAQB
 BgpghkgBZQMCAQMMMBgGCmCGSAGG/WwEBAIGCmCGSAFlAwIBAw8wGAYKYIZIAYb9bAQFAQYKYIZIA
 WUDAgEDEjAYBgpghkgBhv1sBAUCBgpghkgBZQMCAQMTMBgGCmCGSAGG/WwEBQMGCmCGSAFlAwIBAx
 QwFwYJYIZIAYb9bAELBgpghkgBZQMCAQMIMIHfBggrBgEFBQcBCwSB0jCBzzA/BggrBgEFBQcwBYY
 zaHR0cDovL2h0dHAuZnBraS5nb3YvYnJpZGdlL2NhQ2VydHNJc3N1ZWRCeWZiY2EucDdjMIGLBggr
 BgEFBQcwBYZ/bGRhcDovL2xkYXAuZnBraS5nb3YvY249RmVkZXJhbCUyMEJyaWRnZSUyMENBLG91P
 UZQS0ksbz1VLlMuJTIwR292ZXJubWVudCxjPVVTP2NBQ2VydGlmaWNhdGU7YmluYXJ5LGNyb3NzQ2
 VydGlmaWNhdGVQYWlyO2JpbmFyeTAdBgNVHQ4EFgQUxJ38nV06XQV6vwKB7NtJcBXHsnIwHwYDVR0
 jBBgwFoAU0Cs7/2hx1pAM98RzeceZcADlR0AwDQYJKoZIhvcNAQELBQADggEBAKDvyX5eyrDFTt6b
 trs0yB05nbjyeuF7ldfHoFWHhBYdLsKzmR5YdiTMDUBAGCGc7hpANkp1qLI2vjKlLPT9SU/OVa91m
 p9vH5YlxEqx5DtxhhWDxxhu1h1zcSanCJ89IMyiLvzJgQo9wrwcKbiFlfo02J/qPf3L8AHw3NAqCU
 MeSCL6dt/zIBlkKsaaGhVt8Rk5qnV92uTsNNlQ6t7Wb5Kb2hF6uB7/YAR2TzM6vLNKHIZPzc5vp0q
 MqlUvEliPCBfEcfEVCq4vMFHYsfP5bGuEu7lzWPkfKf5GEBu8W5z1URUeBS/oFY4W48CSit34JnKO
 piydiZ+jsEBRoXLZOZmhggZBMIIGPTCCBSWgAwIBAgICCDkwDQYJKoZIhvcNAQELBQAwUjELMAkGA
 1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDENMAsGA1UECxMERlBLSTEaMBgGA1UEAx
 MRRmVkZXJhbCBCcmlkZ2UgQ0EwHhcNMTIwMjA5MTUxNTQzWhcNMTQxMDI2MTQxMjIxWjBkMQswCQY
 DVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t
 MSMwIQYDVQQDExpEaWdpQ2VydCBGZWRlcmF0ZWQgSUQgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADg
 gEPADCCAQoCggEBAMJ4XArNzTmP4QFtzBT1MxQnTsOuyl/U6suW+5PA9BxpUEed1283vK/HatTaZ9
 WrYSM6p6h0iJF3Wc2E6LUVuHq9EfB5mYSXUadDHjkQOKmQZiZ6K2nt6ZwPFM0maD/DL7qD4ALeve3 ENxKR9/pdvewNWLLl4UWehkg8lJNuMOJ/6bLm54TNxooVzrg4mJbCVHYEqnvRZMWWTfuAisiRm9AJ
 A3E0Wb8h4tylCCYks/BddhHpa+MjZNuJ79KpxCKKPvOD6ZJ5Rz/qLESLngv5RKZ3EhlepbXh5xD3d
 +gTFW3vHdrhAK3FjhfO60U5sv/1POGpqLsaFTLwwHz76rtM0A4zygKNgf3X45tOyhI+mzaj9fM37M
 eWU=
crossCertificatePair;binary::MIIOIaCCBykwggclMIIGDaADAgECAhA1NaRHZsnFhU4oae9B
 MGFBMA0GCSqGSIb3DQEBCwUAMDYxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdPUkMgUEtJMRUwEwYDV.....etc
4

2 に答える 2

3

ルックアラウンドで解決できますが、正規表現のタスクではないと思います。

open my $fh, '<', $filename or die $!;
my $binary = do { local $/ = undef; <$fh>; };
close $fh;

my @certs = split /\ncrossCertificatePair;binary::/, $binary;
shift @certs; # you don't need the first part
于 2012-07-10T20:11:40.390 に答える
1

あなたの質問を理解したら、先読みアサーション ?=を使用して重複するものを一致させる必要があると思います。

これはそれを行います:

open my $fh, "<", $filename or die $!;
{local $/; $content = <$fh>;}
close $fh;
my $content =~ s/\s+//g;
my @certs = ($content =~ /crossCertificatePair;binary::(.*?)(?=$|crossCertificatePair;binary::)/g);

ただし、いくつかの主要な仮定があります。つまり、a) スペースと改行を失いたい (そうでない場合は、4 行目を削除する)、および b) 証明書の読み取りを開始したら、できる唯一のことは、次は別の証明書またはファイルの終わりです。

うまくいけば、それで十分です。

于 2012-07-10T19:46:19.023 に答える