使用正则表达式从 Forth 源代码中去除注释

我正在尝试匹配括号之间的所有内容,包括以非贪婪方式的括号。左括号之前和之后应该有一个空格(或左括号之前的行首),右括号之前和之后应该有一个空格。采取以下文本:


 ( )

  ( This is a comment )

    1 2 +

\ a

: square dup * ;

( foo bar 

baz )

(quux)

( ( )

(

( )

第一行应该匹配,包括其内容的第二行应该匹配,倒数第二行不应该匹配(或引发错误),最后一行应该匹配。两行 foo bar baz 应该匹配,但(quux)不应该匹配,因为它在括号前后不包含空格。应该匹配内部带有额外左括号的行。


我尝试了一些传统的正则表达式来匹配括号之间的内容,但没有多大成功。正则表达式引擎是 Go 的引擎。


回首忆惘然
浏览 191回答 3
3回答

手掌心

re := regexp.MustCompile(`(?s)\(( | .*? )\)`)s = re.ReplaceAllString(s, "")游乐场: https: //play.golang.org/p/t93tc_hWAG

Smart猫小萌

正则表达式“无法计数”(过于简化,但请耐心等待),因此您无法匹配无限量的括号嵌套。我猜你最关心的是在这种情况下只匹配一个级别,所以你需要使用类似的东西:foo := regexp.MustCompile(`^ *\( ([^ ]| [^)]*? \)$`)这确实要求注释是一行的最后一件事,因此最好在此处添加“匹配零个或多个空格”。这与字符串 "( ( ) )" 不匹配或尝试满足任意嵌套,因为这远远超出了正则表达式可以做的计数。他们在计数方面可以做的是“计算特定的次数”,他们不能“计算有多少等等,然后确保有相同数量的 flob”(这需要从正则表达式到上下文 -免费语法)。

拉风的咖菲猫

这是一种匹配所有有问题的 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 mainimport (    "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, ")")    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go