2 回答

TA貢獻1876條經驗 獲得超7個贊
由于在否定的回顧中,您只使用了一個簡單的字符集;您可以用否定字符集替換它:
\b[^@#/]\w.*
如果在字符串的開頭允許,則使用^錨點:
(?:^|[^@#\/])\b\w.*
根據您問題中 Go 游樂場鏈接中的示例,我認為您希望過濾掉所有以[#@/]. 您可以使用一個filter函數:
func Filter(vs []string, f func(string) bool) []string {
vsf := make([]string, 0)
for _, v := range vs {
if f(v) {
vsf = append(vsf, v)
}
}
return vsf
}
和一個Process函數,它利用了上面的過濾器:
func Process(inp string) string {
t := strings.Split(inp, " ")
t = Filter(t, func(x string) bool {
return strings.Index(x, "#") != 0 &&
strings.Index(x, "@") != 0 &&
strings.Index(x, "/") != 0
})
return strings.Join(t, " ")
}
它可以在操場上看到http://play.golang.org/p/ntJRNxJTxo

TA貢獻1785條經驗 獲得超8個贊
您實際上可以匹配前面的字符(或行的開頭)并使用組在子表達式中獲取所需的文本。
正則表達式
(?:^|[^@#/])\b(\w+)
(?:^|[^@#/])
匹配^
行首或[^@#/]
任何字符,除了@#/
\b
斷言單詞開頭的單詞邊界(\w+)
生成子表達式并匹配
\w+
任意數量的單詞字符
代碼
cmds := []string{
`/msg @nickname #channel foo bar baz`,
`#channel @nickname foo bar baz /foo`,
`foo bar baz @nickname #channel`,
`foo bar baz#channel`}
regex := regexp.MustCompile(`(?:^|[^@#/])\b(\w+)`)
// Loop all cmds
for _, cmd := range cmds{
// Find all matches and subexpressions
matches := regex.FindAllStringSubmatch(cmd, -1)
fmt.Printf("`%v` \t==>\n", cmd)
// Loop all matches
for n, match := range matches {
// match[1] holds the text matched by the first subexpression (1st set of parentheses)
fmt.Printf("\t%v. `%v`\n", n, match[1])
}
}
輸出
`/msg @nickname #channel foo bar baz` ==>
0. `foo`
1. `bar`
2. `baz`
`#channel @nickname foo bar baz /foo` ==>
0. `foo`
1. `bar`
2. `baz`
`foo bar baz @nickname #channel` ==>
0. `foo`
1. `bar`
2. `baz`
`foo bar baz#channel` ==>
0. `foo`
1. `bar`
2. `baz`
游樂場
http://play.golang.org/p/AaX9Cg-7Vx
- 2 回答
- 0 關注
- 181 瀏覽
添加回答
舉報