gpt4 book ai didi

ruby - 如何覆盖 String.scan 和 FindAllString 中的匹配行为?

转载 作者:IT王子 更新时间:2023-10-29 02:23:17 25 4
gpt4 key购买 nike

我想确定是否可以通过连接一组子字符串中的任何一个来创建给定的字符串。作为一个具体的例子,我想根据正则表达式 sg|ge|ne|n|s 匹配的部分来拆分字符串 "sgene" 。答案是"s", "ge", "ne",因为这三部分是字符串如何分解成的部分正则表达式,所需的子字符串集。

Go 有 regexp.(*Regexp).FindAllString,而 Ruby 有 Regexp.scan 来做这件事。在我的代码中,无论我在超字符串之前还是之后对子字符串进行排序,都会丢失一个匹配项,因为我的正则表达式重叠。


这是一个在 Go 中重现问题的程序:

package main

import (
"fmt"
"regexp"
)

func main() {
str := "sgene"
superBeforeSub := regexp.MustCompile("sg|ge|ne|n|s")
subBeforeSuper := regexp.MustCompile("n|s|sg|ge|ne")
regexes := []*regexp.Regexp{superBeforeSub, subBeforeSuper}
for _, rgx := range regexes {
fmt.Println(rgx.MatchString(str), rgx.FindAllString(str, -1))
}
}

这个程序输出:

true [sg ne]
true [s ge n]

这里是 Ruby 中的相同程序(Ruby 的问题也可见 here ):

str = "sgene"
regexes = [/sg|ge|ne|n|s/, /n|s|sg|ge|ne/]
regexes.each do |regex|
puts "%s %s" % [(regex === str).to_s, str.scan(regex).inspect]
end

输出:

true ["sg", "ne"]
true ["s", "ge", "n"]

正则表达式引擎知道字符串可以被正则表达式匹配,但是 FindAllStringscan 不像 bool 匹配那样匹配它。他们似乎使用忽略至少一个 e 的贪婪最长匹配搜索。如何使用正则表达式将字符串拆分为任一语言的 [s ge ne]

最佳答案

也许我不明白您实际上想做什么,只是简单地更改正则表达式中符号的顺序即可。这不是贪婪与非贪婪的事情,因为您没有使用通配符。

就是简单的按正则顺序匹配的问题。

这是修改后的版本 on Play .唯一不同的是更改正则表达式本身以提供所需的输出。

我所做的只是将“n”移动到模式的末尾,如 s|sg|ge|ne|n

package main

import (
"fmt"
"regexp"
)

func main() {
str := "sgene"
superBeforeSub := regexp.MustCompile("sg|ge|ne|n|s")
subBeforeSuper := regexp.MustCompile("n|s|sg|ge|ne")
orderIActuallyWant := regexp.MustCompile("s|sg|ge|ne|n")
regexes := []*regexp.Regexp{superBeforeSub, subBeforeSuper, orderIActuallyWant}
for _, rgx := range regexes {
fmt.Println(rgx.MatchString(str), rgx.FindAllString(str, -1))
}
}

关于ruby - 如何覆盖 String.scan 和 FindAllString 中的匹配行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36880125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com