package main
import (
"regexp"
"fmt"
)
func main() {
var re = regexp.MustCompile(`(?m)(?i)(?=(\d)\d\d([\s\-\x{2013}\x{2014}\/]))(?<![\d\-\x{2013}\x{2014}%])(?!000|666|9\d\d|\1{3}.\1{2}.\1{4}?|012.34.5678|123.45.6789|234.56.7890|098.76.5432|876.54.3210|078.05.1120|219.09.9999)\d{3}\2(?!00)\d{2}\2(?!0000)\d{4}(?![\d\-\x{2013}\x{2014}%])(?!\.(?:pdf|docx?|xlsx?|pptx?|zip|jpe?g|png|txt|log)\b)`)
var str = `################
## Must match:
################
123-45-4891
098-18-6564
123-45-4848
702-02-0202
001-14-0004
009 95 8881
123-45-4891 is my ssn
my ssn is 123-45-4891
my ssn is 123-45-4891 ok?
my ssn is 123-45-4891.
123454891 is my ssn
123 45 4891 is my ssn
my ssn is 123 45 4891
my ssn is 123 45 4891 ok?
my ssn is 123 45 4891.
my ssn is:123-45-4891.
my ssn is:123 45 4891.
my ssn is:123454891.
ss#123-45-4891
ssn123-45-4891
# Space separator:
123 45 4891
# Emdash separator:
123–45–4891
# Endash separator:
123—45—4891
# Slash separator
123/45/4891
################
## Must not match:
################
# Unformatted SSN:
009958881
my ssn is 123454891
my ssn is 123454891 ok?
my ssn is 123454891.
# All-Zero sequence
231-84-0000
231-00-7289
000-87-7289
231 84 0000
231 00 7289
000 87 7289
# Starting with 9
908-78-0485
908 78 0485
# Starting with 666
666-78-0485
# Same number sequences:
222-22-2222
555-55-5555
# Ascending/Descending sequences:
123-45-6789
876-54-321
# Known invalidated SSN:
219-09-9999
078-05-1120
# File names with common extensions:
123-45-4891.pdf
123-45-4891.xlsx
Check the attachment: 123-45-4891.xls, then get back to me.
Check the attachment: 123-45-4891.jpeg, then get back to me.
# Extra digits:
1123-45-4891
123-45-48911
# Unsupported boundaries:
–123-45-4891
—123-45-4891
%123-45-4891
123-45-4891-
123-45-4891—
123-45-4891%
1-123-45-4891
123-45-4891-1
# Telephone
1-234-567-8901
1-234-567-8901
1-234-567-8901
1 (234) 567-8901
12347658901
# Credit card
5500 0000 0000 0004
3400 0000 0000 009
3000 0000 0000 04
5500-1244-2232-0004
3400-1244-0000-009
3000-1244-1234-04
# Random Numbers
1234567890112371298739872891738912738937289d712897381297381927d3128937893d7218947d1892742189duc89789v127c897412987893c12893c79
122-426-389
187-5-43212
187-0-43212
2423-45-6789
`
for i, match := range re.FindAllString(str, -1) {
fmt.Println(match, "found at index", i)
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Golang, please visit: https://golang.org/pkg/regexp/