Regex 如何选择具有自定义单词边界的第一个字符?
我有过这样一系列的测试用例:Regex 如何选择具有自定义单词边界的第一个字符?,regex,go,pcre,Regex,Go,Pcre,我有过这样一系列的测试用例: { input: "Halley's Comet", expected: "HC", }, { input: "First In, First Out", expected: "FIFO", }, { input: "The Road _Not_ Taken", expected: "TRNT", },
{
input: "Halley's Comet",
expected: "HC",
},
{
input: "First In, First Out",
expected: "FIFO",
},
{
input: "The Road _Not_ Taken",
expected: "TRNT",
},
我希望使用一个正则表达式匹配这些单词的所有首字母,避免将char:“\u1”作为首字母匹配,并计算单词中的单个引号。目前,我有这个正则表达式处理pcre语法,但没有使用Go regexp包:
(?
我知道围观不受围棋的支持,但我正在寻找一种很好的方法
我还使用这个func获取所有字符串的数组:re.FindAllString(s,-1)
感谢您的帮助。使用字符类和单词边界就足够了:
\b_*([a-z])[a-z]*(?:'s)?_*\b\W*
用法:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(?i)\b_*([a-z])[a-z]*(?:'s)?_*\b\W*`)
fmt.Println(re.ReplaceAllString("O'Brian's dog", "$1"))
}
使用字符类和单词边界就足够了:
\b_*([a-z])[a-z]*(?:'s)?_*\b\W*
用法:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(?i)\b_*([a-z])[a-z]*(?:'s)?_*\b\W*`)
fmt.Println(re.ReplaceAllString("O'Brian's dog", "$1"))
}
ftr,无regexp的解决方案
package main
import (
"fmt"
)
func main() {
inputs := []string{"Hallمرحباey's Comet", "First In, First Out", "The Road _Not_ Taken", "O'Brian's Dog"}
c := [][]string{}
w := [][]string{}
for _, input := range inputs {
c = append(c, firstLet(input))
w = append(w, words(input))
}
fmt.Printf("%#v\n", w)
fmt.Printf("%#v\n", c)
}
func firstLet(in string) (out []string) {
var inword bool
for _, r := range in {
if !inword {
if isChar(r) {
inword = true
out = append(out, string(r))
}
} else if r == ' ' {
inword = false
}
}
return out
}
func words(in string) (out []string) {
var inword bool
var w []rune
for _, r := range in {
if !inword {
if isChar(r) {
w = append(w, r)
inword = true
}
} else if r == ' ' {
if len(w) > 0 {
out = append(out, string(w))
w = w[:0]
}
inword = false
} else if r != '_' {
w = append(w, r)
}
}
if len(w) > 0 {
out = append(out, string(w))
}
return out
}
func isChar(r rune) bool {
return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z')
}
ftr,无regexp的解决方案
package main
import (
"fmt"
)
func main() {
inputs := []string{"Hallمرحباey's Comet", "First In, First Out", "The Road _Not_ Taken", "O'Brian's Dog"}
c := [][]string{}
w := [][]string{}
for _, input := range inputs {
c = append(c, firstLet(input))
w = append(w, words(input))
}
fmt.Printf("%#v\n", w)
fmt.Printf("%#v\n", c)
}
func firstLet(in string) (out []string) {
var inword bool
for _, r := range in {
if !inword {
if isChar(r) {
inword = true
out = append(out, string(r))
}
} else if r == ' ' {
inword = false
}
}
return out
}
func words(in string) (out []string) {
var inword bool
var w []rune
for _, r := range in {
if !inword {
if isChar(r) {
w = append(w, r)
inword = true
}
} else if r == ' ' {
if len(w) > 0 {
out = append(out, string(w))
w = w[:0]
}
inword = false
} else if r != '_' {
w = append(w, r)
}
}
if len(w) > 0 {
out = append(out, string(w))
}
return out
}
func isChar(r rune) bool {
return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z')
}
使用具有单词边界的内容不是一个选项?使用具有单词边界的内容不是一个选项?您的解决方案会为您针对OP原始pcre模式((?)添加的输入返回意外结果.我不能使用这个正则表达式来匹配我需要的所有字符串,我可以使用什么函数来获取所有字符串submatches@LoicRoux:如果需要更多子匹配,请在需要的位置添加捕获组,但请给出问题的说明(带示例),如果没有这些信息,我无法为您提供更多帮助。谢谢,但我检查了文档,发现了不同的解决方案,可以使用FindSubmatch()等函数
。您的代码运行良好,只是我的代码使用了findAllStrings
来获取所有匹配项的数组,因此您的正则表达式没有处理它。您的解决方案会为您添加的与OP原始pcre模式((?)有关的输入返回意外结果.我不能使用这个正则表达式来匹配我需要的所有字符串,我可以使用什么函数来获取所有字符串submatches@LoicRoux:如果需要更多子匹配,请在需要的位置添加捕获组,但请给出问题的说明(带示例),如果没有这些信息,我无法为您提供更多帮助。谢谢,但我检查了文档,发现了不同的解决方案,可以使用FindSubmatch()等函数
。您的代码运行良好,只是我使用了findAllStrings
来获取所有匹配项的数组,所以您的正则表达式没有处理它。不过,应该始终编写一个基准来验证这一点。我可以提前说一些事情,如果您要在循环中重复使用它,请调整签名以作为输入参数呃,防止进一步无用的分配。分配是这些函数中的瓶颈,以充分利用这种编程语言。分配必须在您编写的整个管道的范围内考虑。非常感谢,我的初学者的宝贵建议。我使用Vs代码测试用例,它为我提供了一个测试。这足够了吗?请检查这个答案,它演示了如何继续优化代码好的,我仍然在玩你的代码,很好理解…但是,应该始终编写一个基准来验证。我可以提前说一些事情,如果你要在循环中重复使用,请调整签名以e作为一个输入参数输出,并防止进一步无用的分配。分配是这些函数中的瓶颈,以充分利用这种编程语言。分配必须在您编写的整个管道范围内考虑。非常感谢,为我的初学者提供了宝贵的提示。我使用Vs代码测试用例,它为我提供了一个测试的总执行时间。足够吗?请检查这个答案,它演示了如何继续优化代码好的,我还在玩你的代码,很好理解。。。