質問をより一般的に表現すると、別のパターン内のどこかに現れない限り、パターンに一致する正規表現をどのように書くことができますか?
特定のクレジット カード番号に一致する正規表現 (以下を参照) があり、数字のグループ間にダッシュ/スペースがある場合とない場合があります。
任意の位置で始まる UUID 文字列 (「XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX」の形式で、X は任意の 16 進数) 内にクレジット カード番号が表示される場合、一致を防止したいと考えています。
否定先読みは、通常のキャプチャ グループと同様に、CC num が UUID の位置 1 から始まる場合にのみ有効であるため、他の誰かが別の戦略を持っていることを願っています。
Visa カード番号の正規表現グループの例:
(4\d{3}(?:[\s_\-\n\r\.]*\d{4}){3})
一致してはならない文字列の例:
uuid1="836ac40c-e6ed-4026-2222-44443333f465" uuid2="46120710-5880-4000-8060-f0fadf056136"
一致する文字列の例:
4026-2222-44443333
46120710-5880-4000
4111222233334444
4999-8888-7777-6666
クレジット カード番号の処理に関する PCI コンプライアンス ルールにより、文字列が安全であることが明確にわかっている場合 (UUID など) を除き、文字列内の番号を厳密に検出しようとしています。
使用されている正規表現エンジンは、ルックアラウンドと後方参照をサポートしていますが、条件はサポートしていません。