2017-03-05 6 views
0

4文字以上のRegex Matchで問題が発生しました。私は4文字で試してみましたが、の種類が返されます。ただし、4文字以上の場合は、のような偽のが返されます。そこで何が起こったのか教えてください。Regex Match 4文字以上

public static string CardRegex = 
     @"^(?:(?<VisaDebit>4744)| 
     (?<Discover>6011)| 
     (?<Amex>3[47]\d{2}))([ -]?)(?(DinersClub)(?:\d{6}\1\d{4})|(?(Amex)(?:\d{6}\1\d{5})|(?:\d{4}\1\d{4}\1\d{4})))$"; 
public static CreditCardTypeType? GetCardTypeFromNumber(string cardNum) 
    { 
     var cardTest = new Regex(CardRegex); 

     var gc = cardTest.Match(cardNum).Groups; 

     if (gc[CreditCardTypeType.VisaDebit.ToString()].Success) 
      return CreditCardTypeType.VisaDebit; 
     if (gc[CreditCardTypeType.Discover.ToString()].Success) 
      return CreditCardTypeType.Discover; 
     return null; 
    } 

入力:4744721015347572

(?<VisaDebit>4744) ==> return VisaDebit 
(?<VisaDebit>4744**7**) ==> return null 
+1

申し訳ありませんが、あなたの質問は不明です。あなたの唯一のサンプル文字列は '4744721015347572'で、あなたの正規表現は一致します(IgnoreWhitespaceフラグ付きでコンパイルされた場合)](http://regexstorm.net/tester?p=%5e%28%3f%3a%28%3f% 3cVisaDebit%3e4744%29%7c%0d%0a ++++++++%28%3f%3cDiscover%3e6011%29%7c%0d%0a ++++++++%28%3f%3cAmex%3e3%5b47%5d%5cd%7b2%7d%29%29% 28%5b + - %5d%3f%29%28%3f%28DinersClub%29%28%3f%3a%5cd%7b6%7d%5c1%5cd%7b4%7d%29%7c%28%3f%28Amex%29 %28%3f%3a%5cd%7b6%7d%5c1%5cd%7b5%7d%29%7c%28%3f%3a%5cd%7b4%7d%5c1%5cd%7b4%7d%5c1%5cd%7b4 * VisaDebit *グループでは「4744」と%7d%29%29%29%24&i = 4744721015347572&o = x)です。 –

答えて

1

^文字列の先頭に現在位置が

$は、文字列の末尾に現在位置をアサートアサート

これらはキャプチャグループの外にあるため、入力したすべてのカード番号が一致する必要がありますが、これは意図的なものです。ただし、5桁の数字は何も一致しません。

(?:(?<VisaDebit>4744)の場合、この4桁の数字を検索しています。上記のアサーションとともに、この4桁の数字だけを一致させています。なぜなら、47447は一致しません。それは、あなたの選択肢が一致しない限り、文字列の終わりを主張した場所を基本的に超えています。


Diner's Clubの条件(?(DinersClub)には、同じ名前のグループがありません。これが意図的なのかどうかわかりません。


最初に一致するパターンに何か誤りがあります。これは変わらない正規表現です。私はあなたの分岐を見ることができるようにフォーマットしました。

^ 
(?: 
    (?<VisaDebit>4744) 
| 
    (?<Discover>6011) 
| 
    (?<Amex>3[47]\d{2}) 
) 
([ -]?) 
(?(DinersClub)     # as described above, you have no DinersClub Group 
    (?:\d{6}\1\d{4}) 
| 
    (?(Amex) 
    (?:\d{6}\1\d{5})   # this is a problem similar to the analasys below 
    | 
    (?:\d{4}\1\d{4}\1\d{4}) # this is probably a problem 
) 
)$ 

問題サブパターンanalasys

\d{4} # this is saying any 4 digits 
\1  # this is a repetition of CG 1. Whatever it matched 
     # not any 4 digits, but 4744 
\d{4} # any 4 digits 
\1  # explained above 
\d{4} # any 4 digits 

おそらく一致させることができます番号のビザ条件に一致することはありませんしています。 Visaを試行していますが、一致しないこと、バックトラックすること、DiscoverをスキップしてAmExを試してみることなどがわかります。

編集:わかりました。あなたは、名前付きグループにまだ番号が付けられていることを認識していないかもしれません。