Golang实现查找给定文本中所有选中单词的方法

Golang实现查找给定文本中所有选中单词的方法 我有以下代码,希望用户输入一些关键词,然后找出这些词中哪些存在于给定的字符串中,但结果 matches 切片是一个空切片,其长度等于待检查的文本长度。 playground

package main

import (
	"fmt"
	"regexp"
)

func main() {
	p := []string{}
	p = append(p, "engineer")
	p = append(p, "doctor")
	var skills string
	for _, z := range p {
		skills += `|` + z
	}
	fmt.Println(skills)
	re := regexp.MustCompile(`(?i)` + skills)

	matches := re.FindAllString("I'm an engineer not a doctor", -1)
	fmt.Println(matches)
	for i, j := range matches {
		fmt.Println(i, j)
	}
}

更多关于Golang实现查找给定文本中所有选中单词的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

谢谢!我可能应该先学些基础知识,而不是妄下断言。

更多关于Golang实现查找给定文本中所有选中单词的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢,所以我的错误在于在技能的开头使用了分隔符 '|'

kdimtri:

我猜问题在于你用 ‘|’ 连接单词,单词之间应该有空格。

不对。这是一个 ERE(扩展正则表达式)。此外,对于任何集合 A,空集都是 A 的子集。

我自己也在学习,但我猜问题在于你用 ‘|’ 连接单词时,单词之间应该有空格。不过你可以试试 'z + " |" '。

package main
import (
	"fmt"
	"regexp"
)

func main() {
	p := []string{}
	p = append(p, "engineer")
	p = append(p, "doctor")
	var skills string
	for _, z := range p {
		skills += " |"+ z
	}
	fmt.Println(skills)
	re := regexp.MustCompile(`(?i)` + skills)

	matches := re.FindAllString("I'm an engineer not a doctor", -1)
	fmt.Println(matches)
	for i, j := range matches {
		fmt.Println(i, j)
	}
}
package main

import (
	"fmt"
	"regexp"
)

func main() {
	p := []string{}
	p = append(p, "engineer")
	p = append(p, "doctor")
	var skills string
	for _, z := range p {
		skills += z + "|"
	}
	if len(skills) > 0 {
		skills = skills[:len(skills)-1]
	}
	fmt.Println(skills)
	re := regexp.MustCompile(`(?i)` + skills)

	matches := re.FindAllString("I'm an engineer not a doctor", -1)
	fmt.Println(matches)
	for i, j := range matches {
		fmt.Println(i, j)
	}
}

https://play.golang.org/p/G0eJK8HEXxw

engineer|doctor
[engineer doctor]
0 engineer
1 doctor

你的代码中 skills 变量的初始值为空字符串,然后通过循环拼接 p 中的单词,这会导致正则表达式以 | 开头,从而匹配到空字符串。FindAllString 方法会返回所有匹配项,包括空字符串,所以 matches 切片长度等于输入文本的长度(每个字符间都被视为匹配了空字符串)。

以下是修正后的代码:

package main

import (
	"fmt"
	"regexp"
	"strings"
)

func main() {
	words := []string{"engineer", "doctor"}
	text := "I'm an engineer not a doctor"
	
	// 构建正则表达式,用 | 连接单词,并添加 (?i) 忽略大小写
	pattern := `(?i)(` + strings.Join(words, "|") + `)`
	re := regexp.MustCompile(pattern)
	
	matches := re.FindAllString(text, -1)
	fmt.Printf("找到 %d 个匹配: %v\n", len(matches), matches)
	
	for i, match := range matches {
		fmt.Printf("匹配 %d: %s\n", i, match)
	}
}

输出:

找到 2 个匹配: [engineer doctor]
匹配 0: engineer
匹配 1: doctor

或者使用更简单的方法,无需正则表达式:

package main

import (
	"fmt"
	"strings"
)

func main() {
	words := []string{"engineer", "doctor"}
	text := "I'm an engineer not a doctor"
	
	var matches []string
	for _, word := range words {
		if strings.Contains(strings.ToLower(text), strings.ToLower(word)) {
			matches = append(matches, word)
		}
	}
	
	fmt.Printf("找到 %d 个匹配: %v\n", len(matches), matches)
}

输出:

找到 2 个匹配: [engineer doctor]
回到顶部