regex - 正则表达式找到具有优先顺序的匹配项?

标签 regex go

给定这样的代码:

str := "hi hey hello"
regexpr := `(?i)hello|hey|hi`
fmt.Println(regexp.MustCompile(regexpr).FindStringSubmatch(str))

它给出这样的结果:
[hi]

但我想得到一个[hello]作为结果。因为在我的情况下,“hello”是第一优先级,所以第二优先级是“hey”,然后是“hi”。我该如何实现?

我只知道将关键字放入 slice 并循环播放的解决方案。但是使用单个正则表达式操作则不会。

是否可以使用单个正则表达式操作?

最佳答案

您应该记住,正则表达式引擎从左到右搜索匹配项。因此,“将优先级设置为替代项”意味着“让每个替代匹配项位于当前位置右侧的任何位置”。

你应该用

regexpr := `(?i).*?(hello)|.*?(hey)|.*?(hi)`

在这里,.*?将匹配除换行符以外的任何0个或多个字符,并且尽可能少。在代码中,使用
regexp.MustCompile(regexpr).FindStringSubmatch(str)[1]

参见Go playground demo:
package main

import (
    "fmt"
    "regexp"
)

func main() {
    str := "hi hey hello"
    regexpr := `(?i).*?(hello)|.*?(hey)|.*?(hi)`
    fmt.Println(regexp.MustCompile(regexpr).FindStringSubmatch(str)[1])
}

关于regex - 正则表达式找到具有优先顺序的匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61836985/

相关文章:

regex - PowerShell 和 RegEx 格式化

正则表达式:如何在选择前检查是否只有空格

regex - 为什么要实现不同的正则表达式引擎(例如 PCRE)作为编译指示?

go - 来自不同 channel 的数据进入 select 语句可以被忽略吗?

php - 实时计算特定主题标签的推文数量

javascript - 如何将字符串分割为两个或多个单词?

regex - 如何为具有字母数字字符但不仅仅由数字组成的单词编写正则表达式?

go - 对 SNMP 消息进行编码并从代理读取响应

go - 在函数内部定义函数

go - 在编码为 JSON 之前将结构转换为不同的结构