Compare commits
6 Commits
v0.1.0
...
ab363e2766
| Author | SHA1 | Date | |
|---|---|---|---|
| ab363e2766 | |||
| c803e45415 | |||
| 525296f239 | |||
| eb0ab9f7ec | |||
| 17a7dbae4c | |||
| f2279acd98 |
@@ -33,7 +33,7 @@ Perl classes:
|
|||||||
\d Match any digit character ([0-9])
|
\d Match any digit character ([0-9])
|
||||||
\D Match any non-digit character ([^0-9])
|
\D Match any non-digit character ([^0-9])
|
||||||
\w Match any word character ([a-zA-Z0-9_])
|
\w Match any word character ([a-zA-Z0-9_])
|
||||||
\W Match any word character ([^a-zA-Z0-9_])
|
\W Match any non-word character ([^a-zA-Z0-9_])
|
||||||
\s Match any whitespace character ([ \t\n])
|
\s Match any whitespace character ([ \t\n])
|
||||||
\S Match any non-whitespace character ([^ \t\n])
|
\S Match any non-whitespace character ([^ \t\n])
|
||||||
|
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ func ExampleReg_FindAll() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ExampleReg_FindString() {
|
func ExampleReg_FindString() {
|
||||||
regexStr := `\d+`
|
regexStr := `\w+\s+(?=sheep)`
|
||||||
regexComp := regex.MustCompile(regexStr)
|
regexComp := regex.MustCompile(regexStr)
|
||||||
|
|
||||||
matchStr := regexComp.FindString("The year of our lord, 2025")
|
matchStr := regexComp.FindString("pink cows and yellow sheep")
|
||||||
fmt.Println(matchStr)
|
fmt.Println(matchStr)
|
||||||
// Output: 2025
|
// Output: yellow
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExampleReg_FindSubmatch() {
|
func ExampleReg_FindSubmatch() {
|
||||||
@@ -53,6 +53,71 @@ func ExampleReg_FindSubmatch() {
|
|||||||
// 2 3
|
// 2 3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleReg_FindStringSubmatch() {
|
||||||
|
regexStr := `(\d{4})-(\d{2})-(\d{2})`
|
||||||
|
regexComp := regex.MustCompile(regexStr)
|
||||||
|
inputStr := `The date is 2025-02-10`
|
||||||
|
|
||||||
|
match := regexComp.FindStringSubmatch(inputStr)
|
||||||
|
fmt.Println(match[1])
|
||||||
|
fmt.Println(match[3])
|
||||||
|
// Output: 2025
|
||||||
|
// 10
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleReg_FindAllSubmatch() {
|
||||||
|
regexStr := `(\d)\.(\d)(\d)`
|
||||||
|
regexComp := regex.MustCompile(regexStr)
|
||||||
|
|
||||||
|
matches := regexComp.FindAllSubmatch("3.14+8.97")
|
||||||
|
fmt.Println(matches[0][0]) // 0-group (entire match) of 1st match (0-indexed)
|
||||||
|
fmt.Println(matches[0][1]) // 1st group of 1st match
|
||||||
|
fmt.Println(matches[1][0]) // 0-group of 2nd match
|
||||||
|
fmt.Println(matches[1][1]) // 1st group of 2nd math
|
||||||
|
// Output: 0 4
|
||||||
|
// 0 1
|
||||||
|
// 5 9
|
||||||
|
// 5 6
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleReg_FindAllString() {
|
||||||
|
regexStr := `<0-255>\.<0-255>\.<0-255>\.<0-255>`
|
||||||
|
inputStr := `192.168.220.7 pings 9.9.9.9`
|
||||||
|
regexComp := regex.MustCompile(regexStr)
|
||||||
|
|
||||||
|
matchStrs := regexComp.FindAllString(inputStr)
|
||||||
|
|
||||||
|
fmt.Println(matchStrs[0])
|
||||||
|
fmt.Println(matchStrs[1])
|
||||||
|
// Output: 192.168.220.7
|
||||||
|
// 9.9.9.9
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExampleReg_FindAllStringSubmatch() {
|
||||||
|
// 'https' ...
|
||||||
|
// followed by 1 or more alphanumeric characters (including period) ...
|
||||||
|
// then a forward slash ...
|
||||||
|
// followed by one more of :
|
||||||
|
// word character,
|
||||||
|
// question mark,
|
||||||
|
// period,
|
||||||
|
// equals sign
|
||||||
|
regexStr := `https://([a-z0-9\.]+)/([\w.?=]+)`
|
||||||
|
regexComp := regex.MustCompile(regexStr, regex.RE_CASE_INSENSITIVE)
|
||||||
|
inputStr := `You can find me at https://twomorecents.org/index.html and https://news.ycombinator.com/user?id=aadhavans`
|
||||||
|
|
||||||
|
matchIndices := regexComp.FindAllStringSubmatch(inputStr)
|
||||||
|
fmt.Println(matchIndices[0][1]) // 1st group of 1st match (0-indexed)
|
||||||
|
fmt.Println(matchIndices[0][2]) // 2nd group of 1st match
|
||||||
|
fmt.Println(matchIndices[1][1]) // 1st group of 2nd match
|
||||||
|
fmt.Println(matchIndices[1][2]) // 2nd group of 2nd match
|
||||||
|
// Output: twomorecents.org
|
||||||
|
// index.html
|
||||||
|
// news.ycombinator.com
|
||||||
|
// user?id=aadhavans
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func ExampleReg_Expand() {
|
func ExampleReg_Expand() {
|
||||||
inputStr := `option1: value1
|
inputStr := `option1: value1
|
||||||
option2: value2`
|
option2: value2`
|
||||||
|
|||||||
@@ -205,6 +205,29 @@ func (re Reg) FindAllSubmatch(str string) []Match {
|
|||||||
return indices
|
return indices
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FindAllSubmatch returns a double-slice of strings. Each slice contains the text of a match, including all submatches.
|
||||||
|
// A return value of nil indicates no match.
|
||||||
|
func (re Reg) FindAllStringSubmatch(str string) [][]string {
|
||||||
|
match := re.FindAllSubmatch(str)
|
||||||
|
if len(match) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
rtv := make([][]string, len(match))
|
||||||
|
for i := range rtv {
|
||||||
|
rtv[i] = make([]string, re.numGroups+1)
|
||||||
|
}
|
||||||
|
rtv = funcMap(match, func(m Match) []string {
|
||||||
|
return funcMap(m, func(g Group) string {
|
||||||
|
if g.IsValid() {
|
||||||
|
return str[g.StartIdx:g.EndIdx]
|
||||||
|
} else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return rtv
|
||||||
|
}
|
||||||
|
|
||||||
func addStateToList(str []rune, idx int, list []nfaState, state nfaState, threadGroups []Group, visited []nfaState, preferLongest bool) []nfaState {
|
func addStateToList(str []rune, idx int, list []nfaState, state nfaState, threadGroups []Group, visited []nfaState, preferLongest bool) []nfaState {
|
||||||
if stateExists(list, state) || stateExists(visited, state) {
|
if stateExists(list, state) || stateExists(visited, state) {
|
||||||
return list
|
return list
|
||||||
|
|||||||
@@ -861,6 +861,60 @@ func TestFindStringSubmatch(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFindAllStringSubmatch(t *testing.T) {
|
||||||
|
for _, test := range groupTests {
|
||||||
|
t.Run(test.re+" "+test.str, func(t *testing.T) {
|
||||||
|
regComp, err := Compile(test.re, test.flags...)
|
||||||
|
if err != nil {
|
||||||
|
if test.result != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
matchStrs := regComp.FindAllStringSubmatch(test.str)
|
||||||
|
if matchStrs == nil {
|
||||||
|
if len(test.result) != 0 {
|
||||||
|
expectedStrs := funcMap(test.result, func(m Match) []string {
|
||||||
|
return funcMap(m, func(g Group) string {
|
||||||
|
if g.IsValid() {
|
||||||
|
return test.str[g.StartIdx:g.EndIdx]
|
||||||
|
} else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
t.Errorf("Wanted %v got no match\n", expectedStrs)
|
||||||
|
}
|
||||||
|
} else if len(test.result) == 0 {
|
||||||
|
t.Errorf("Wanted no match got %v\n", matchStrs)
|
||||||
|
} else {
|
||||||
|
expectedStrs := funcMap(test.result, func(m Match) []string {
|
||||||
|
return funcMap(m, func(g Group) string {
|
||||||
|
if g.IsValid() {
|
||||||
|
return test.str[g.StartIdx:g.EndIdx]
|
||||||
|
} else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
for i, matchStr := range matchStrs {
|
||||||
|
for j, groupStr := range matchStr {
|
||||||
|
if groupStr == "" {
|
||||||
|
if j < len(expectedStrs[i]) && expectedStrs[i][j] != "" {
|
||||||
|
t.Errorf("Wanted %v Got %v\n", expectedStrs, matchStrs)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if expectedStrs[i][j] != groupStr {
|
||||||
|
t.Errorf("Wanted %v Got %v\n", expectedStrs, matchStrs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestFindAllSubmatch(t *testing.T) {
|
func TestFindAllSubmatch(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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user