0

質問をより一般的に表現すると、別のパターン内のどこかに現れない限り、パターンに一致する正規表現をどのように書くことができますか?

特定のクレジット カード番号に一致する正規表現 (以下を参照) があり、数字のグループ間にダッシュ/スペースがある場合とない場合があります。

任意の位置で始まる 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 など) を除き、文字列内の番号を厳密に検出しようとしています。

使用されている正規表現エンジンは、ルックアラウンドと後方参照をサポートしていますが、条件はサポートしていません。

4

1 に答える 1

1

アンカーまたは単語境界を使用するだけです。

/\b(4\d{3}(?:[\s._-]*\d{4}){3})\b/

[\s_\-\n\r\.]また、私が単純化したことに注意してください[\s._-]

于 2013-09-07T00:49:11.393 に答える