80 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"slices"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| var reTests = []struct {
 | |
| 	re     string
 | |
| 	str    string
 | |
| 	result []matchIndex
 | |
| }{
 | |
| 	{"a", "abc", []matchIndex{{0, 1}}},
 | |
| 	{"a", "bca", []matchIndex{{2, 3}}},
 | |
| 	{"l", "ggllgg", []matchIndex{{2, 3}, {3, 4}}},
 | |
| 	{"(b|c)", "abdceb", []matchIndex{{1, 2}, {3, 4}, {5, 6}}},
 | |
| 	{"a+", "brerereraaaaabbbbb", []matchIndex{{8, 13}}},
 | |
| 	{"ab+", "qweqweqweaqweqweabbbbbr", []matchIndex{{16, 22}}},
 | |
| 	{"(b|c|A)", "ooaoobocA", []matchIndex{{5, 6}, {7, 8}, {8, 9}}},
 | |
| 	{"ab*", "a", []matchIndex{{0, 1}}},
 | |
| 	{"ab*", "abb", []matchIndex{{0, 3}}},
 | |
| 	{"a*b", "aaab", []matchIndex{{0, 4}}},
 | |
| 	{"a*b", "qwqw", []matchIndex{}},
 | |
| 	{"(abc)*", "abcabcabc", []matchIndex{{0, 9}}},
 | |
| 	{"((abc)|(def))*", "abcdef", []matchIndex{{0, 6}}},
 | |
| 	{"(abc)*|(def)*", "abcdef", []matchIndex{{0, 3}, {3, 3}, {3, 6}, {6, 6}}},
 | |
| 	{"b*a*a", "bba", []matchIndex{{0, 3}}},
 | |
| 	{"(ab)+", "abcabddd", []matchIndex{{0, 2}, {3, 5}}},
 | |
| 	{"a(b(c|d)*)*", "abccbd", []matchIndex{{0, 6}}},
 | |
| 	{"a(b|c)*d+", "abccdd", []matchIndex{{0, 6}}},
 | |
| 	{"a*", "", []matchIndex{{0, 0}}},
 | |
| 	{"a|b", "c", []matchIndex{}},
 | |
| 	{"(a|b)*c", "aabbc", []matchIndex{{0, 5}}},
 | |
| 	{"a(b|b)", "ab", []matchIndex{{0, 2}}},
 | |
| 	{"a*", "aaaaaaaa", []matchIndex{{0, 8}, {8, 8}}},
 | |
| 
 | |
| 	{"ab?", "ab", []matchIndex{{0, 2}}},
 | |
| 	{"a?b", "ab", []matchIndex{{0, 2}}},
 | |
| 	{"a?", "", []matchIndex{{0, 0}}},
 | |
| 	{"a?b?c", "a", []matchIndex{}},
 | |
| 	{"a?b?c?", "ab", []matchIndex{{0, 2}}},
 | |
| 	{"a?b?c?", "ac", []matchIndex{{0, 2}}},
 | |
| 	{"a?b?c", "abc", []matchIndex{{0, 3}}},
 | |
| 	{"a?b?c", "acb", []matchIndex{{0, 2}}},
 | |
| 
 | |
| 	{"[abc]", "defadefbdefce", []matchIndex{{3, 4}, {7, 8}, {11, 12}}},
 | |
| 	{"[ab]c", "ab", []matchIndex{}},
 | |
| 	{"g[ab]c", "gac", []matchIndex{{0, 3}}},
 | |
| 	{"g[ab]c", "gbc", []matchIndex{{0, 3}}},
 | |
| 	{"g[ab]c", "gc", []matchIndex{}},
 | |
| 	{"g[ab]c", "gfc", []matchIndex{}},
 | |
| 	{"[ab]*", "aabbbabaababab", []matchIndex{{0, 14}}},
 | |
| 	{"[ab]+", "aabbbabaababab", []matchIndex{{0, 14}}},
 | |
| 	{"[Ff]r[Uu]it", "fruit", []matchIndex{{0, 5}}},
 | |
| 	{"[Ff]r[Uu]it", "FrUit", []matchIndex{{0, 5}}},
 | |
| 	{"[Ff]r[Uu|]it", "Fr|it", []matchIndex{{0, 5}}},
 | |
| 	{"[Ff]r([Uu]|[pP])it", "Frpit", []matchIndex{{0, 5}}},
 | |
| 	{"[Ff]r[Uu]|[pP]it", "Frpit", []matchIndex{{2, 5}}},
 | |
| 	{"[a-zA-Z]+", "Hello, how is it going?", []matchIndex{{0, 5}, {7, 10}, {11, 13}, {14, 16}, {17, 22}}},
 | |
| 
 | |
| 	{".+", "Hello, how is it going?", []matchIndex{{0, 23}}},
 | |
| 	{"a.", "a ", []matchIndex{{0, 2}}},
 | |
| 	{"a.b", "a/b", []matchIndex{{0, 3}}},
 | |
| 	{".", "a ", []matchIndex{{0, 2}}},
 | |
| 	{"a.", "a ", []matchIndex{{0, 2}}},
 | |
| }
 | |
| 
 | |
| func TestFindAllMatches(t *testing.T) {
 | |
| 	for _, test := range reTests {
 | |
| 		t.Run(test.re+"	"+test.str, func(t *testing.T) {
 | |
| 			re_postfix := shuntingYard(test.re)
 | |
| 			startState := thompson(re_postfix)
 | |
| 			matchIndices := findAllMatches(startState, test.str)
 | |
| 			if !slices.Equal(test.result, matchIndices) {
 | |
| 				t.Errorf("Wanted %v	Got %v\n", test.result, matchIndices)
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 |