为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
回首忆惘然 2022-03-07 16:29:21
我正在尝试匹配括号之间的所有内容,包括以非贪婪方式的括号。左括号之前和之后应该有一个空格(或左括号之前的行首),右括号之前和之后应该有一个空格。采取以下文本: ( )  ( This is a comment )    1 2 +\ a: square dup * ;( foo bar baz )(quux)( ( )(( )第一行应该匹配,包括其内容的第二行应该匹配,倒数第二行不应该匹配(或引发错误),最后一行应该匹配。两行 foo bar baz 应该匹配,但(quux)不应该匹配,因为它在括号前后不包含空格。应该匹配内部带有额外左括号的行。我尝试了一些传统的正则表达式来匹配括号之间的内容,但没有多大成功。正则表达式引擎是 Go 的引擎。
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

re := regexp.MustCompile(`(?s)\(( | .*? )\)`)

s = re.ReplaceAllString(s, "")

游乐场: https: //play.golang.org/p/t93tc_hWAG


查看完整回答
反对 回复 2022-03-07
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

正则表达式“无法计数”(过于简化,但请耐心等待),因此您无法匹配无限量的括号嵌套。我猜你最关心的是在这种情况下只匹配一个级别,所以你需要使用类似的东西:

foo := regexp.MustCompile(`^ *\( ([^ ]| [^)]*? \)$`)

这确实要求注释是一行的最后一件事,因此最好在此处添加“匹配零个或多个空格”。这与字符串 "( ( ) )" 不匹配或尝试满足任意嵌套,因为这远远超出了正则表达式可以做的计数。

他们在计数方面可以做的是“计算特定的次数”,他们不能“计算有多少等等,然后确保有相同数量的 flob”(这需要从正则表达式到上下文 -免费语法)。


查看完整回答
反对 回复 2022-03-07
?
拉风的咖菲猫

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, ")")

    }

}


查看完整回答
反对 回复 2022-03-07
  • 3 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信