私は正規表現が苦手ですが、次のものがありますが、次の手段の一部は13〜16桁を探し、その後3〜4桁が見つかった場合は成功を返すと想定しています。問題は、3 桁から 4 桁はオプションであり、13 桁から 16 桁の数字の前にもある可能性があるため、正の先読み/後読み、負の先読み/後読みを組み合わせたいと思います。これは複雑に思えますが、もっと簡単な方法はありますか?
(\d{13,16})[<"'].*?(?=[>"']\d{3,4}[<"'])[>"'](\d{3,4})[<"']
これは、次のスニペットの ccnum とシリーズに一致します。
<CreditCard>
name="John Doe""
ccnum=""1111123412341231""
series="339"
exp="03/13">
</CreditCard>
ただし、ccnum またはシリーズを削除すると、何にも一致せず、シリーズはオプションになる可能性があります。また、シリーズは ccnum の前後に表示される可能性があるため、シリーズ属性を ccnum 属性の前に配置すると、どちらにも一致しません。また、ccnum の前に別の要素としてシリーズがある場合、またはシリーズ要素を無視した場合にも一致しません。
<CreditCard>
<series>234</series>
<ccnum>1235583839293838</ccnum>
</CreditCard>
次のシナリオに一致する正規表現が必要ですが、要素の正確な名前がわかりません。この場合、ccnum と series と呼んでいます。
機能するものは次のとおりです。
<CreditCard>
<ccnum>1235583839293838</ccnum>
<series>123</series>
</CreditCard>
<CreditCard ccnum="1838383838383833">
<series>123</series>
</CreditCard>
<CreditCard ccnum="1838383838383833" series="139"
</CreditCard>
次のものにも一致する必要がありますが、一致しません。
<CreditCard ccnum="1838383838383833"
</CreditCard>
<CreditCard series="139" ccnum="1838383838383833"
</CreditCard>
<CreditCard ccnum="1838383838383833"></CreditCard>
<CreditCard>
<series>123</series>
<ccnum>1235583839293838</ccnum>
</CreditCard>
<CreditCard>
<ccnum series="123">1235583839293838</ccnum>
</CreditCard>
現在、これを機能させるために、3 つの個別の正規表現を使用しています。
1 は、セキュリティ コードの前にあるクレジット カード番号と一致します。
1 は、クレジット カード番号の前にあるセキュリティ コードと一致します。
1 はクレジット カード番号のみに一致します。
式を or に結合しようとしましたが、合計 5 つのグループになりました (最初の 2 つの式から 2 つ、最後の式から 1 つ)。