3 回答
TA贡献1942条经验 获得超3个赞
re := regexp.MustCompile(`(?s)\(( | .*? )\)`)
s = re.ReplaceAllString(s, "")
游乐场: https: //play.golang.org/p/t93tc_hWAG
TA贡献1911条经验 获得超7个赞
正则表达式“无法计数”(过于简化,但请耐心等待),因此您无法匹配无限量的括号嵌套。我猜你最关心的是在这种情况下只匹配一个级别,所以你需要使用类似的东西:
foo := regexp.MustCompile(`^ *\( ([^ ]| [^)]*? \)$`)
这确实要求注释是一行的最后一件事,因此最好在此处添加“匹配零个或多个空格”。这与字符串 "( ( ) )" 不匹配或尝试满足任意嵌套,因为这远远超出了正则表达式可以做的计数。
他们在计数方面可以做的是“计算特定的次数”,他们不能“计算有多少等等,然后确保有相同数量的 flob”(这需要从正则表达式到上下文 -免费语法)。
TA贡献1995条经验 获得超2个赞
这是一种匹配所有有问题的 3 行的方法:
(?m)^[\t\p{Zs}]*\([\pZs}\t](?:[^()\n]*[\pZs}\t])?\)[\pZs}\t]*$
在新的regex101.com上查看 Go 正则表达式演示
详情:
(?m)
- 多行模式开启^
- 由于上述原因,一行的开始[\t\p{Zs}]*
- 0+ 水平空格\(
- 一种(
[\pZs}\t]
- 正好 1 个水平空白(?:[^()\n]*[\pZs}\t])?
- 一个可选的序列匹配:[^()\n]*
- 一个否定字符类,匹配 0+ 以外的字符(
和)
一个换行符[\pZs}\t]
- 水平空白\)
- 文字)
[\pZs}\t]*
- 0+ 水平空格$
- 由于(?m)
, 一行的结尾。
去游乐场演示:
package main
import (
"regexp"
"fmt"
)
func main() {
var re = regexp.MustCompile(`(?m)^[\t\p{Zs}]*\([\pZs}\t](?:[^()\n]*[\pZs}\t])?\)[\pZs}\t]*$`)
var str = ` ( )
( This is a comment )
1 2 +
\ a
: square dup * ;
( foo bar
baz )
(quux)
( ( )
(
( )`
for i, match := range re.FindAllString(str, -1) {
fmt.Println("'", match, "' (found at index", i, ")")
}
}
- 3 回答
- 0 关注
- 190 浏览
添加回答
举报