|
|
@ -1,6 +1,7 @@
|
|
|
|
package main
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
|
|
|
|
"fmt"
|
|
|
|
"slices"
|
|
|
|
"slices"
|
|
|
|
"testing"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -185,6 +186,56 @@ var reTests = []struct {
|
|
|
|
{`a.*b`, nil, "acc\nccb", []Group{}},
|
|
|
|
{`a.*b`, nil, "acc\nccb", []Group{}},
|
|
|
|
{`a.{4,5}b`, nil, "acc\nccb", []Group{}},
|
|
|
|
{`a.{4,5}b`, nil, "acc\nccb", []Group{}},
|
|
|
|
{`a.b`, nil, "a\rb", []Group{{0, 3}}},
|
|
|
|
{`a.b`, nil, "a\rb", []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`a.b`, []ReFlag{RE_MULTILINE}, "a\nb", []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`a.*b`, []ReFlag{RE_MULTILINE}, "acc\nccb", []Group{{0, 7}}},
|
|
|
|
|
|
|
|
{`a.{4,5}b`, []ReFlag{RE_MULTILINE}, "acc\nccb", []Group{{0, 7}}},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{`)`, nil, ``, nil},
|
|
|
|
|
|
|
|
{`^$`, nil, ``, []Group{{0, 0}}},
|
|
|
|
|
|
|
|
{`abc`, nil, `abc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`abc`, nil, `xbc`, []Group{}},
|
|
|
|
|
|
|
|
{`abc`, nil, `axc`, []Group{}},
|
|
|
|
|
|
|
|
{`abc`, nil, `abx`, []Group{}},
|
|
|
|
|
|
|
|
{`abc`, nil, `xabcy`, []Group{{1, 4}}},
|
|
|
|
|
|
|
|
{`abc`, nil, `ababc`, []Group{{2, 5}}},
|
|
|
|
|
|
|
|
{`ab*c`, nil, `abc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`ab*bc`, nil, `abc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`ab*bc`, nil, `abbc`, []Group{{0, 4}}},
|
|
|
|
|
|
|
|
{`ab*bc`, nil, `abbbbc`, []Group{{0, 6}}},
|
|
|
|
|
|
|
|
{`ab+bc`, nil, `abbc`, []Group{{0, 4}}},
|
|
|
|
|
|
|
|
{`ab+bc`, nil, `abc`, []Group{}},
|
|
|
|
|
|
|
|
{`ab+bc`, nil, `abq`, []Group{}},
|
|
|
|
|
|
|
|
{`ab+bc`, nil, `abbbbc`, []Group{{0, 6}}},
|
|
|
|
|
|
|
|
{`ab?bc`, nil, `abbc`, []Group{{0, 4}}},
|
|
|
|
|
|
|
|
{`ab?bc`, nil, `abc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`ab?bc`, nil, `abbbbc`, []Group{}},
|
|
|
|
|
|
|
|
{`ab?c`, nil, `abc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`^abc$`, nil, `abc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`^abc$`, nil, `abcc`, []Group{}},
|
|
|
|
|
|
|
|
{`^abc`, nil, `abcc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`^abc$`, nil, `aabc`, []Group{}},
|
|
|
|
|
|
|
|
{`abc$`, nil, `aabc`, []Group{{1, 4}}},
|
|
|
|
|
|
|
|
{`^`, nil, `abc`, []Group{{0, 0}}},
|
|
|
|
|
|
|
|
{`$`, nil, `abc`, []Group{{3, 3}}},
|
|
|
|
|
|
|
|
{`a.c`, nil, `abc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`a.c`, nil, `axc`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`a.*c`, nil, `axyzc`, []Group{{0, 5}}},
|
|
|
|
|
|
|
|
{`a.*c`, nil, `axyzd`, []Group{}},
|
|
|
|
|
|
|
|
{`a[bc]d`, nil, `abc`, []Group{}},
|
|
|
|
|
|
|
|
{`a[bc]d`, nil, `abd`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`a[b-d]e`, nil, `abd`, []Group{}},
|
|
|
|
|
|
|
|
{`a[b-d]e`, nil, `ace`, []Group{{0, 3}}},
|
|
|
|
|
|
|
|
{`a[b-d]`, nil, `aac`, []Group{{1, 3}}},
|
|
|
|
|
|
|
|
{`a[-b]`, nil, `a-`, []Group{{0, 2}}}, // If a character class has a hyphen without a start or end character, it is treated as a literal hyphen
|
|
|
|
|
|
|
|
{`a[\-b]`, nil, `a-`, []Group{{0, 2}}},
|
|
|
|
|
|
|
|
{`a[b-]`, nil, `a-`, []Group{{0, 2}}}, // If a character class has a hyphen without a start or end character, it is treated as a literal hyphen
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{`a[]b`, nil, `-`, nil},
|
|
|
|
|
|
|
|
{`a[`, nil, `-`, nil},
|
|
|
|
|
|
|
|
{`a\`, nil, `-`, nil},
|
|
|
|
|
|
|
|
{`abc)`, nil, `-`, nil},
|
|
|
|
|
|
|
|
{`(abc`, nil, `-`, nil},
|
|
|
|
|
|
|
|
{`a]`, nil, `a]`, []Group{{0, 2}}},
|
|
|
|
|
|
|
|
|
|
|
|
// Todo - add numeric range tests
|
|
|
|
// Todo - add numeric range tests
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -223,7 +274,7 @@ func TestFindAllMatches(t *testing.T) {
|
|
|
|
regComp, err := Compile(test.re, test.flags...)
|
|
|
|
regComp, err := Compile(test.re, test.flags...)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
if test.result != nil {
|
|
|
|
if test.result != nil {
|
|
|
|
panic(err)
|
|
|
|
panic(fmt.Errorf("Test Error: %v", err))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
matchIndices := FindAllMatches(regComp, test.str)
|
|
|
|
matchIndices := FindAllMatches(regComp, test.str)
|
|
|
@ -242,7 +293,7 @@ func TestFindAllMatches(t *testing.T) {
|
|
|
|
func TestFindString(t *testing.T) {
|
|
|
|
func TestFindString(t *testing.T) {
|
|
|
|
for _, test := range reTests {
|
|
|
|
for _, test := range reTests {
|
|
|
|
t.Run(test.re+" "+test.str, func(t *testing.T) {
|
|
|
|
t.Run(test.re+" "+test.str, func(t *testing.T) {
|
|
|
|
regComp, err := Compile(test.re)
|
|
|
|
regComp, err := Compile(test.re, test.flags...)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
if test.result != nil {
|
|
|
|
if test.result != nil {
|
|
|
|
panic(err)
|
|
|
|
panic(err)
|
|
|
@ -267,7 +318,7 @@ func TestFindString(t *testing.T) {
|
|
|
|
func TestFindAllGroups(t *testing.T) {
|
|
|
|
func TestFindAllGroups(t *testing.T) {
|
|
|
|
for _, test := range groupTests {
|
|
|
|
for _, test := range groupTests {
|
|
|
|
t.Run(test.re+" "+test.str, func(t *testing.T) {
|
|
|
|
t.Run(test.re+" "+test.str, func(t *testing.T) {
|
|
|
|
regComp, err := Compile(test.re)
|
|
|
|
regComp, err := Compile(test.re, test.flags...)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
if test.result != nil {
|
|
|
|
if test.result != nil {
|
|
|
|
panic(err)
|
|
|
|
panic(err)
|
|
|
|