fork download
  1. package main
  2.  
  3. import (
  4. "log"
  5. )
  6.  
  7. func match(pat, s string) bool {
  8. next := func(i, j int) bool {
  9. return match(pat[i:], s[j:])
  10. }
  11. switch {
  12. case pat == "":
  13. return s == ""
  14. case s == "":
  15. return pat == ""
  16. case pat[0] == '\\' && len(pat) > 1:
  17. return next(2, 1)
  18. }
  19. switch pat[0] {
  20. case '*':
  21. for i := range s {
  22. if next(1, i) {
  23. return true
  24. }
  25. }
  26. return false
  27. case '?':
  28. return next(1, 1)
  29. }
  30. return pat[0] == s[0] && next(1, 1)
  31. }
  32.  
  33. func main() {
  34. type t []struct {
  35. s string
  36. expected bool
  37. }
  38. groups := []struct {
  39. pat string
  40. tests t
  41. }{
  42. {"", t{
  43. {"", true},
  44. {"aa", false},
  45. }},
  46. {"aa", t{
  47. {"aa", true},
  48. {"", false},
  49. }},
  50. {`a\*a\?a`, t{
  51. {"a*a?a", true},
  52. {"aaa", false},
  53. }},
  54. {`\`, t{
  55. {"\\", true},
  56. {"aaa", false},
  57. }},
  58. {"a?*bb*cd", t{
  59. {"aababbcd", true},
  60. {"abcd", false},
  61. {"aa?bxcxd", false},
  62. }},
  63. {"a*?b*c*d", t{
  64. {"abcd", false},
  65. {"aabcd", true},
  66. {"a?bcd", true},
  67. {"aa?bxcxd", true},
  68. {"aa?bxcd", true},
  69. }},
  70. {"as*d*?qwe*qwe", t{
  71. {"as123dssqwe12345678qwe", true},
  72. }},
  73. }
  74. ok := func(got, expect bool) string {
  75. if got == expect {
  76. return " ok "
  77. } else {
  78. return "fail"
  79. }
  80. }
  81. for _, group := range groups {
  82. for _, test := range group.tests {
  83. res := match(group.pat, test.s)
  84. log.Printf("[%s] %30q ~ %-20q %v",
  85. ok(res, test.expected), test.s, group.pat, res)
  86. }
  87. }
  88. }
  89.  
Success #stdin #stdout #stderr 0s 790016KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
2015/10/15 16:18:55 [ ok ]                             "" ~ ""                   true
2015/10/15 16:18:55 [ ok ]                           "aa" ~ ""                   false
2015/10/15 16:18:55 [ ok ]                           "aa" ~ "aa"                 true
2015/10/15 16:18:55 [ ok ]                             "" ~ "aa"                 false
2015/10/15 16:18:55 [ ok ]                        "a*a?a" ~ "a\\*a\\?a"          true
2015/10/15 16:18:55 [ ok ]                          "aaa" ~ "a\\*a\\?a"          false
2015/10/15 16:18:55 [ ok ]                           "\\" ~ "\\"                 true
2015/10/15 16:18:55 [ ok ]                          "aaa" ~ "\\"                 false
2015/10/15 16:18:55 [ ok ]                     "aababbcd" ~ "a?*bb*cd"           true
2015/10/15 16:18:55 [ ok ]                         "abcd" ~ "a?*bb*cd"           false
2015/10/15 16:18:55 [ ok ]                     "aa?bxcxd" ~ "a?*bb*cd"           false
2015/10/15 16:18:55 [ ok ]                         "abcd" ~ "a*?b*c*d"           false
2015/10/15 16:18:55 [ ok ]                        "aabcd" ~ "a*?b*c*d"           true
2015/10/15 16:18:55 [ ok ]                        "a?bcd" ~ "a*?b*c*d"           true
2015/10/15 16:18:55 [ ok ]                     "aa?bxcxd" ~ "a*?b*c*d"           true
2015/10/15 16:18:55 [ ok ]                      "aa?bxcd" ~ "a*?b*c*d"           true
2015/10/15 16:18:55 [ ok ]       "as123dssqwe12345678qwe" ~ "as*d*?qwe*qwe"      true