2017-03-05 4 views
0

Ich habe ein Problem mit dem Regex Match mit mehr als 4 Zeichen. Ich habe versucht mit 4 Zeichen und es gibt Art der wahren zurück. Für mehr als 4 Zeichen gibt es jedoch Art der falschen zurück. Bitte lassen Sie mich wissen, was dort passiert ist.Regex Match mehr als 4 Zeichen

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; 
    } 

Input: 4744721015347572

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

Sorry, Ihre Frage ist irgendwie unklar. Ihre einzige Probe String '4744721015347572' und Ihre regex [zeigt eine Übereinstimmung (wenn mit ignoreWhitespace Flag kompiliert)] (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 % 7d% 29% 29% 29% 24 & i = 4744721015347572 & o = x) mit '4744' in * VisaDebit * Gruppe.Ist es OK? –

Antwort

1

^ die aktuelle Position am Anfang einer Zeichenfolge behauptet

$ behauptet die aktuelle Position am Ende der Zeichenkette

Da es sich um außerhalb der Erfassungsgruppen handelt, muss jede eingegebene Kartennummer übereinstimmen, was natürlich beabsichtigt ist. Eine 5-stellige Nummer entspricht jedoch nichts.

Im Fall von (?:(?<VisaDebit>4744), bist du diese für 4-stellige Zahl. Zusammen mit den oben beschriebenen Behauptungen passen Sie diese 4-stellige Zahl allein an, weshalb 47447 nicht übereinstimmt, es überschreitet grundsätzlich, wo Sie das Ende der Zeichenfolge geltend gemacht haben, es sei denn, einer Ihrer Alternativen entspricht.


Sie haben ein Diner Zustand (?(DinersClub) ohne gleich bezeichneten Gruppe. Ich weiß nicht, ob das beabsichtigt ist.


Irgendetwas ist falsch in Ihrem passenden Muster zu beginnen. Dies ist Ihre Regex, unverändert. Ich habe es nur so formatiert, dass Sie Ihre Verzweigung sehen können.

^ 
(?: 
    (?<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 
) 
)$ 

Problem Unter-Pattern 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 

Du bist wahrscheinlich nie die Visa bedingt mit der Nummer passend, die mithalten können. Es versucht Visa, zu erkennen, dass es nicht passt, Backtracking, Skipping Entdecke und probiere AmEx und folge ihm.

Edit: ich sehe, ich sehe. Sie haben vielleicht nicht bemerkt, dass Named Groups noch nummeriert sind.