亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用正則表達式從 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 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號