Go正则匹配

基本使用


Go正则获取全部匹配的结果:

在Go语言中,可以使用regexp包进行正则表达式的匹配。通过该包提供的FindAllString或FindAllStringSubmatch方法,可以获取全部匹配的结果。

FindAllString方法用于获取正则表达式在给定字符串中的所有非重叠匹配项,返回值为一个字符串切片。

以下是一个示例代码,演示如何使用FindAllString方法获取全部匹配结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"regexp"
)

func main() {
// 定义正则表达式
re := regexp.MustCompile(`\d+`)

// 需要匹配的字符串
str := "100 apple, 200 banana, 300 orange"

// 获取全部匹配结果
result := re.FindAllString(str, -1)

// 打印结果
fmt.Println(result)
}

输出结果为:

1
[100 200 300]

另外,如果正则表达式中包含分组,则可以使用FindAllStringSubmatch方法获取全部匹配结果和分组匹配结果。该方法返回一个切片,其中每个元素都是一个包含所有匹配项及其分组匹配结果的字符串切片。

以下是一个示例代码,演示如何使用FindAllStringSubmatch方法获取全部匹配结果和分组匹配结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
"fmt"
"regexp"
)

func main() {
// 定义正则表达式,包含分组
re := regexp.MustCompile(`(\d+) (\w+)`)

// 需要匹配的字符串
str := "100 apple, 200 banana, 300 orange"

// 获取全部匹配结果和分组匹配结果
result := re.FindAllStringSubmatch(str, -1)

// 打印结果
for _, r := range result {
fmt.Println(r[0]) // 匹配项
fmt.Println(r[1]) // 第一个分组匹配项
fmt.Println(r[2]) // 第二个分组匹配项
}
}
1
2
3
4
5
6
7
8
9
100 apple
100
apple
200 banana
200
banana
300 orange
300
orange



提取字符串中全部的http或https链接


1
(?:https?://)[^\s]+

解释一下:

(?:https?://) 匹配 http:// 或 https://,(?:…) 表示非捕获分组,只匹配不捕获。
[^\s]+ 匹配一个或多个非空白字符,直到遇到下一个空白字符或字符串的结尾。
这个正则表达式会匹配所有符合上述模式的字符串,包括以下例子:

请注意,这个正则表达式可能会把一些不是链接的文本也匹配出来,比如 email 地址中的 @ 符号。因此,你需要根据具体情况自行处理匹配结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

package main

import (
"fmt"
"regexp"
)

func main() {

s := `

链接为: athttps://github.com/libimobiledevice/libimobiledevice.
filePath:/Users/fliter/fixgo/20230305/go/misc/ios/detect.go
-----------------

链接为: https://golang.org/issue/22735 //
filePath:/Users/fliter/fixgo/20230305/go/src/archive/tar/common.go
-----------------

链接为: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06
filePath:/Users/fliter/fixgo/20230305/go/src/archive/tar/common.go
-----------------

链接为: filenames.Reference: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06
filePath:/Users/fliter/fixgo/20230305/go/src/archive/tar/format.go `

re := regexp.MustCompile(`(?:https?://)[^\s]+`)

//res := re.FindStringSubmatch(s)
res := re.FindAllString(s, -1)

fmt.Println(res)

}

输出:

1
[https://github.com/libimobiledevice/libimobiledevice. https://golang.org/issue/22735 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_06]

写程序判断这些链接的返回的状态码是不是200


在Go语言中,可以使用net/http包来进行HTTP请求,通过检查HTTP响应的状态码来判断某个链接的返回值是不是200。

以下是一个示例代码,演示如何检查某个链接的返回值是否为200:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
"fmt"
"net/http"
)

func main() {
// 需要检查的链接
url := "https://www.example.com/"

// 发送HTTP GET请求
resp, err := http.Get(url)
if err != nil {
// 处理请求错误
fmt.Println("HTTP请求错误:", err)
return
}
defer resp.Body.Close()

// 检查HTTP响应状态码
if resp.StatusCode == http.StatusOK {
fmt.Println("链接返回值为200")
} else {
fmt.Println("链接返回值不是200")
}
}

在上面的示例代码中,首先使用http.Get方法发送HTTP GET请求,获取到HTTP响应后,使用resp.StatusCode属性检查HTTP响应状态码是否为200。如果是200,则表示链接返回值为200,否则表示链接返回值不是200。

需要注意的是,在使用完http.Response对象后,需要调用resp.Body.Close()方法来关闭响应体,释放相关资源。