一. 正则表达式

  • 正则表达式:(Regular Expression)
  • 正则表达式就正则字符和普通字符组成字符串的规则
  • 正则内容如下

    1. 单字符:
    2. . 任意字符(标志s==true时还包括换行符)
    3. [xyz] 字符族
    4. [^xyz] 反向字符族
    5. \d Perl预定义字符族
    6. \D 反向Perl预定义字符族
    7. [:alpha:] ASCII字符族
    8. [:^alpha:] 反向ASCII字符族
    9. \pN Unicode字符族(单字符名),参见unicode
    10. \PN 反向Unicode字符族(单字符名)
    11. \p{Greek} Unicode字符族(完整字符名)
    12. \P{Greek} 反向Unicode字符族(完整字符名)
    13. 结合:
    14. xy 匹配x后接着匹配y
    15. x|y 匹配xy(优先匹配x
    16. 重复:
    17. x* 重复>=0次匹配x,越多越好(优先重复匹配x
    18. x+ 重复>=1次匹配x,越多越好(优先重复匹配x
    19. x? 01次匹配x,优先1
    20. x{n,m} nm次匹配x,越多越好(优先重复匹配x
    21. x{n,} 重复>=n次匹配x,越多越好(优先重复匹配x
    22. x{n} 重复n次匹配x
    23. x*? 重复>=0次匹配x,越少越好(优先跳出重复)
    24. x+? 重复>=1次匹配x,越少越好(优先跳出重复)
    25. x?? 01次匹配x,优先0
    26. x{n,m}? nm次匹配x,越少越好(优先跳出重复)
    27. x{n,}? 重复>=n次匹配x,越少越好(优先跳出重复)
    28. x{n}? 重复n次匹配x
    29. 分组:
    30. (re) 编号的捕获分组
    31. (?P<name>re) 命名并编号的捕获分组
    32. (?:re) 不捕获的分组
    33. (?flags) 设置当前所在分组的标志,不捕获也不匹配
    34. (?flags:re) 设置re段的标志,不捕获的分组
    35. 标志的语法为xyz(设置)、-xyz(清楚)、xy-z(设置xy,清楚z),标志如下:
    36. I 大小写敏感(默认关闭)
    37. m ^和$在匹配文本开始和结尾之外,还可以匹配行首和行尾(默认开启)
    38. s 让.可以匹配\n(默认关闭)
    39. U 非贪婪的:交换x*和x*?、x+和x+?……的含义(默认关闭)
    40. 边界匹配:
    41. ^ 匹配文本开始,标志m为真时,还匹配行首
    42. $ 匹配文本结尾,标志m为真时,还匹配行尾
    43. \A 匹配文本开始
    44. \b 单词边界(一边字符属于\w,另一边为文首、文尾、行首、行尾或属于\W
    45. \B 非单词边界
    46. \z 匹配文本结尾
    47. 转义序列:
    48. \a 响铃符(\007
    49. \f 换纸符(\014
    50. \t 水平制表符(\011
    51. \n 换行符(\012
    52. \r 回车符(\015
    53. \v 垂直制表符(\013
    54. \123 八进制表示的字符码(最多三个数字)
    55. \x7F 十六进制表示的字符码(必须两个数字)
    56. \x{10FFFF} 十六进制表示的字符码
    57. \* 字面值'*'
    58. \Q...\E 反斜线后面的字符的字面值
    59. 字符族(预定义字符族之外,方括号内部)的语法:
    60. x 单个字符
    61. A-Z 字符范围(方括号内部才可以用)
    62. \d Perl字符族
    63. [:foo:] ASCII字符族
    64. \pF 单字符名的Unicode字符族
    65. \p{Foo} 完整字符名的Unicode字符族
    66. 预定义字符族作为字符族的元素:
    67. [\d] == \d
    68. [^\d] == \D
    69. [\D] == \D
    70. [^\D] == \d
    71. [[:name:]] == [:name:]
    72. [^[:name:]] == [:^name:]
    73. [\p{Name}] == \p{Name}
    74. [^\p{Name}] == \P{Name}
    75. Perl字符族:
    76. \d == [0-9]
    77. \D == [^0-9]
    78. \s == [\t\n\f\r ]
    79. \S == [^\t\n\f\r ]
    80. \w == [0-9A-Za-z_]
    81. \W == [^0-9A-Za-z_]
    82. ASCII字符族:
    83. [:alnum:] == [0-9A-Za-z]
    84. [:alpha:] == [A-Za-z]
    85. [:ascii:] == [\x00-\x7F]
    86. [:blank:] == [\t ]
    87. [:cntrl:] == [\x00-\x1F\x7F]
    88. [:digit:] == [0-9]
    89. [:graph:] == [!-~] == [A-Za-z0-9!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]
    90. [:lower:] == [a-z]
    91. [:print:] == [ -~] == [ [:graph:]]
    92. [:punct:] == [!-/:-@[-`{-~]
    93. [:space:] == [\t\n\v\f\r ]
    94. [:upper:] == [A-Z]
    95. [:word:] == [0-9A-Za-z_]
    96. [:xdigit:] == [0-9A-Fa-f]
  • 常用正则整理如下:

    • /+特殊字母 : 代表某个取值范围
    • [内容]:代表一个字符,字符的取值范围就是内部的内容
    • {n,m}个数,大于等于n小于等于m个
    • .一个任意内容的字符
    • ^开始
    • $结束
    • +至少一个
    • *任意个
    • ?最多一个

二. Go语言对正则的支持

  • 在regexp包中提供了对正则表达式的支持,并提供了RegExp结构体

    • 可以看出里面有互斥锁,所以在并发下是安全的

      1. // Regexp is the representation of a compiled regular expression.
      2. // A Regexp is safe for concurrent use by multiple goroutines,
      3. // except for configuration methods, such as Longest.
      4. type Regexp struct {
      5. // read-only after Compile
      6. regexpRO
      7. // cache of machines for running regexp
      8. mu sync.Mutex
      9. machine []*machine
      10. }
  • 判断字符串是否与正则匹配最简单的办法是

    1. result,_:=regexp.MatchString(`^\d\w$`,"5A")
    2. fmt.Println(result)
  • 如果需要更多的功能,可以使用Regexp的方式实现,下面列举除了一些常用方法 ```go package main

import ( “regexp” “fmt” )

func main() { //创建结构体变量 r := regexp.MustCompile(\d[a-zA-Z]) //判断是否匹配 fmt.Println(r.MatchString(“5A1”)) / 字符串中满足要求的片段,返回[]string 第二个参数是[]string的长度,-1表示不限制长度 / fmt.Println(r.FindAllString(“56A6B7C”, -1)) / 把正则表达式匹配的结果当作拆分符,拆分字符串 n > 0 : 返回最多n个子字符串,最后一个子字符串是剩余未进行分割的部分。 n == 0: 返回nil (zero substrings) n < 0 : 返回所有子字符串 / fmt.Println(r.Split(“12345qwert”, -1)) //把满足正则要求内容替换成指定字符串 fmt.Println(r.ReplaceAllString(“12345qwert”, “替换了”)) }

  1. <a name="806e2ae7"></a>
  2. # 三.服务器端数据校验
  3. - 数据校验可以有客户端数据校验和服务器端数据校验.双重保证是保证程序安全性的有效措施
  4. - 客户端向服务端发送请求参数,服务器端接收到请求参数后使用正则验证,验证结果通过才能正确执行,例如注册时验证数据格式
  5. - HTML代码如下
  6. ```html
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  8. "http://www.w3.org/TR/html4/loose.dtd">
  9. <html>
  10. <head>
  11. <title></title>
  12. </head>
  13. <body>
  14. <form action="register" method="post">
  15. 用户名:<input type="text" name="username"/>用户名必须时6-12位,只能包含字符或数字<br/>
  16. <input type="submit" value="注册"/>
  17. </form>
  18. </body>
  19. </html>
  • 服务器代码如下 ```go package main

import ( “net/http” “html/template” “regexp” “fmt” )

func welcome(w http.ResponseWriter, r *http.Request) { t, _ := template.ParseFiles(“view/index.html”) t.Execute(w, nil) }

func register(w http.ResponseWriter, r *http.Request) { { u := r.FormValue(“username”) r, _ := regexp.MatchString(^[0-9a-zA-Z]{6,12}$, u) if r { fmt.Fprintln(w, “注册成功”) } else { fmt.Fprintln(w, “用户名格式不正确”) } } }

func main() { server := http.Server{Addr: “:8090”} http.Handle(“/static/“, http.StripPrefix(“/static/“, http.FileServer(http.Dir(“static”)))) http.HandleFunc(“/“, welcome) http.HandleFunc(“/register”, register) server.ListenAndServe() } ```