Skip to content

Commit 4aefa6c

Browse files
committed
Credit cards
1 parent d61f864 commit 4aefa6c

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ Programming
125125

126126
- [Comments](https://github.com/gekomad/scala-regex-collection/wiki/Comments) (/* foo */)
127127

128+
Credit Cards
129+
130+
- [Visa](https://github.com/gekomad/scala-regex-collection/wiki/CreditCards) (/* 4111111111111 */)
131+
- [Master Card](https://github.com/gekomad/scala-regex-collection/wiki/CreditCards) (/* 5500000000000004 */)
132+
- [American Express](https://github.com/gekomad/scala-regex-collection/wiki/CreditCards) (/* 340000000000009 */)
133+
- [Diners Club](https://github.com/gekomad/scala-regex-collection/wiki/CreditCards) (/* 30000000000004 */)
134+
- [Discover](https://github.com/gekomad/scala-regex-collection/wiki/CreditCards) (/* 6011000000000004 */)
135+
- [JCB](https://github.com/gekomad/scala-regex-collection/wiki/CreditCards) (/* 3588000000000009 */)
136+
128137
## Use the library
129138

130139

src/main/scala/com/github/gekomad/regexcollection/Validator.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ trait Fahrenheit
9696
trait HtmlHref
9797

9898
trait Comments
99+
trait CreditCardVisa
100+
trait CreditCardMasterCard
101+
trait CreditCardAmericanExpress
102+
trait CreditCardinersClub
103+
trait CreditCardDiscover
104+
trait CreditCardJCB
99105

100106
object Collection {
101107

@@ -263,7 +269,15 @@ object Collection {
263269
implicit val validatorTime: Validator[Time] =
264270
Validator[Time]("""(([0-9]|[0-1][0-9]|[2][0-3]):([0-5][0-9])(\s{0,1})(AM|PM|am|pm|aM|Am|pM|Pm{2,2})$)|(^([0-9]|[1][0-9]|[2][0-3])(\s{0,1})(AM|PM|am|pm|aM|Am|pM|Pm{2,2}))""")
265271

266-
implicit val validatorComment: Validator[Comments] = Validator[Comments]("""(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)""")
272+
implicit val validatorComment: Validator[Comments] = Validator[Comments]("""(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)""")
273+
274+
implicit val validatorCreditCardVisa: Validator[CreditCardVisa] = Validator[CreditCardVisa]("""4[0-9]{12}(?:[0-9]{3})?""")
275+
implicit val validatorCreditCardMasterCard: Validator[CreditCardMasterCard] = Validator[CreditCardMasterCard]("""(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}""")
276+
implicit val validatorCreditCardAmericanExpress: Validator[CreditCardAmericanExpress] = Validator[CreditCardAmericanExpress]("""3[47][0-9]{13}""")
277+
implicit val validatorCreditCardDinersClub: Validator[CreditCardinersClub] = Validator[CreditCardinersClub]("""3(?:0[0-5]|[68][0-9])[0-9]{11}""")
278+
implicit val validatorCreditCardDiscover: Validator[CreditCardDiscover] = Validator[CreditCardDiscover]("""6(?:011|5[0-9]{2})[0-9]{12}""")
279+
implicit val validatorCreditCardJCB: Validator[CreditCardJCB] = Validator[CreditCardJCB]("""(?:2131|1800|35\d{3})\d{11}""")
280+
267281
implicit val validatorLocalDateTime: Validator[LocalDateTime] = Validator[LocalDateTime]((a: String) => Try(LocalDateTime.parse(a, ISO_LOCAL_DATE_TIME)).toOption.map(_ => a))
268282

269283
implicit val validatorLocalDate: Validator[LocalDate] = Validator[LocalDate]((a: String) => Try(LocalDate.parse(a, ISO_LOCAL_DATE)).toOption.map(_ => a))

src/test/scala/Validate.scala

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -956,10 +956,11 @@ class Validate extends AnyFunSuite {
956956
import com.github.gekomad.regexcollection.Collection.Validator
957957
import scala.util.Try
958958

959-
implicit val validator = Validator[Foo]((a: String) =>
960-
Try(a.toInt) match {
961-
case Failure(_) => None
962-
case Success(i) => if (i % 2 == 0) Option(a) else None
959+
implicit val validator = Validator[Foo](
960+
(a: String) =>
961+
Try(a.toInt) match {
962+
case Failure(_) => None
963+
case Success(i) => if (i % 2 == 0) Option(a) else None
963964
}
964965
)
965966

@@ -975,11 +976,55 @@ class Validate extends AnyFunSuite {
975976
assert(validate[Comments]("hi") == None)
976977
assert(validate[Comments]("/*hi") == None)
977978
assert(validate[Comments]("/*hi*/") == Some("/*hi*/"))
978-
assert(validate[Comments](
979-
"""/*hi
980-
|foo * */""".stripMargin) == Some(
981-
"""/*hi
979+
assert(validate[Comments]("""/*hi
980+
|foo * */""".stripMargin) == Some("""/*hi
982981
|foo * */""".stripMargin))
983982
}
984983

984+
test("CreditCardVisa") {
985+
import com.github.gekomad.regexcollection.CreditCardVisa
986+
import com.github.gekomad.regexcollection.Validate.validate
987+
assert(validate[CreditCardVisa]("4111x") == None)
988+
assert(validate[CreditCardVisa]("411111a111111") == None)
989+
assert(validate[CreditCardVisa]("4111111111111111") == Some("4111111111111111"))
990+
assert(validate[CreditCardVisa]("4111111111111") == Some("4111111111111"))
991+
}
992+
993+
test("CreditCarMasterCard") {
994+
import com.github.gekomad.regexcollection.CreditCardMasterCard
995+
import com.github.gekomad.regexcollection.Validate.validate
996+
assert(validate[CreditCardMasterCard]("4111x") == None)
997+
assert(validate[CreditCardMasterCard]("550000000a000004") == None)
998+
assert(validate[CreditCardMasterCard]("5500000000000004") == Some("5500000000000004"))
999+
}
1000+
1001+
test("CreditCarAmericanExpress") {
1002+
import com.github.gekomad.regexcollection.CreditCardAmericanExpress
1003+
import com.github.gekomad.regexcollection.Validate.validate
1004+
assert(validate[CreditCardAmericanExpress]("4111x") == None)
1005+
assert(validate[CreditCardAmericanExpress]("140000000000009") == None)
1006+
assert(validate[CreditCardAmericanExpress]("340000000000009") == Some("340000000000009"))
1007+
}
1008+
1009+
test("CreditCarDinersClub") {
1010+
import com.github.gekomad.regexcollection.CreditCardinersClub
1011+
import com.github.gekomad.regexcollection.Validate.validate
1012+
assert(validate[CreditCardinersClub]("4111x") == None)
1013+
assert(validate[CreditCardinersClub]("30000000000004") == Some("30000000000004"))
1014+
}
1015+
1016+
test("CreditCardDiscover") {
1017+
import com.github.gekomad.regexcollection.CreditCardDiscover
1018+
import com.github.gekomad.regexcollection.Validate.validate
1019+
assert(validate[CreditCardDiscover]("4111x") == None)
1020+
assert(validate[CreditCardDiscover]("6011000000000004") == Some("6011000000000004"))
1021+
}
1022+
1023+
test("CreditCardJCB") {
1024+
import com.github.gekomad.regexcollection.CreditCardJCB
1025+
import com.github.gekomad.regexcollection.Validate.validate
1026+
assert(validate[CreditCardJCB]("4111x") == None)
1027+
assert(validate[CreditCardJCB]("3588000000000009") == Some("3588000000000009"))
1028+
}
1029+
9851030
}

0 commit comments

Comments
 (0)