Can you help me with a regex pattern that finds the below:

Visa:

1. A string that starts with the number "4" and is either:

A. Followed by 15 integers and then a non-integer.

B. Followed by a pattern like this "4000-0000-0000-0000" where the dash can be any ASCII printable character other than a number and the zeros can be any integer.

MasterCard:

1. A string that starts with the numbers "51" or 52 or 53 or 54 or 55 and is either:

A. Followed by 15 integers and then a non-integer.

B. Followed by a pattern like this "5100-0000-0000-0000" where the dash can be any ASCII character other than a number and the zeros can be any integer.

American Express:

1. A string that starts with the numbers 34 or 37 and is either:

A. Followed by 14 integers and then a non-integer.

B. Followed by a pattern like this "3400-000000-00000" where the dash can be any ASCII printable character other than a number and the zeros can be any integer.

Discover Card:

1. A string that starts with the numbers 60 or 62 or 64 or 65 and is either:

A. Followed by 14 integers and then a non-integer.

B. Followed by a pattern like this "6200-0000-0000-0000" where the dash can be any ASCII printable character other than a number and the zeros can be any integer.

http://en.wikipedia.org/wiki/Bank_card_number
PS. Have to have a "non-integer after the 16 digit integer string" so that long number strings like 12341234434563452345324523

4532453245 are not returned. We're looking for text like this, "I was talking with a customer about their order and they gave me their new credit card number of 4567-8901-2345-6789 because the old one didn't work but the system was offline right before lunch so I wrote their credit card number here in this note where my manager told me not to."
/(^|\D)((4\d|5[12345]|6[02