유효한 카드 번호를 감지하기 위해 다음 정규식을 사용하고 있습니다.
[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]
그러나 다음은 감지하지 못합니다.
374355011240344
373116614411000
하지만 내 웹사이트에서 동일한 콘텐츠를 사용하는 경우:http://www.regexr.com/, 모두 감지되었습니다.
이것과 호환성 문제가 있나요?
내가 원하는 것은 어떤 패턴이든 감지하는 것입니다.
- 2,3,4,5,6부터 시작
- 4자리 간격으로 " " 또는 "-"로 구분 가능 (2345-3456-2345-2345 / 4567 6745 5645 4534 345)
- 길이는 13~19까지 가능합니다.
내가 사용한 명령은 다음과 같습니다.
for i in * */*;
do
grep -ocE "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]" "$i";
done `
답변1
표현식을 제공하는 유틸리티, 명령을 호출할 때 사용되는 인수, 명령이 호출되는 셸 등에 따라 정규 표현식을 평가하는 방법에 차이와 제한이 있습니다.
그런데 grep과 함께 정규식을 사용할 때 정규식의 마지막 부분이 일치 항목으로 나열되지 않아 문자 수를 초과합니다(찾는 문자가 아님).
[{0} 01:49:15] $ echo "374355011240344" | grep -Eo "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]"
[{1} 01:49:33] $ echo "374355011240344" | grep -Eo "[2-6][0-9]{3}([ -]?)[0-9]{4}([ -]?)[0-9]{4}([ -]?)[0-9]{3,4}([ -]?)[0-9]{0,3}[^a-zA-Z]?"
374355011240344
다음 웹사이트에서는 신용카드 정규식에 관한 책을 썼습니다.신용카드 정규식
이 정규식은 유효한 Visa, MC 및 Amex와 일치합니다.
"^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})$"
내가 제공한 링크는 모든 주요 CC를 포함하도록 이 정규식을 "확장"하는 방법을 보여줍니다. 그들의 일반적인 접근 방식(가치가 있는 점에 대해서는 동의합니다)은 패턴 일치 전에 공백, 대시 등을 제거하여 관련 없는 문자를 제거하는 것입니다. 이는 조사해 볼 가치가 있을 수 있습니다.
다른 여러 웹사이트가 있습니다:
http://reluctanthacker.rollett.org/creating-regex-finding-credit-card-numbers-grep
답변2
이는 luhn 알고리즘을 사용하여 더 잘 수행할 수 있습니다. bash에서 이를 구현하는 방법에 대한 토론은 여기에서 찾을 수 있습니다.https://codereview.stackexchange.com/questions/95211/validating-a-credit-card-number-using-luhns-algorithm