簡體   English   中英

正則表達式問題匹配模式

[英]regex problems matching pattern

我的正則表達式並沒有真正做到我想要的。 它需要在我的文本文件中找到所有以行開頭的匹配項:

func anyword() {

模式將執行此操作,但是我希望它在下一個}停止。 但是,如果出現以下一種或多種情況:

SomeFunction();  

應該跳過下一個}

這是它將掃描的文本的示例。 每行都帶有注釋,以顯示該怎么做:

override func something() {   // here is a start pattern
                              // still looking for an }
halloworld() { };             // bracket } found but is ignored because line also contains "()"
                              // still looking for an } 
                              // still looking for an }
}                             // found closing bracket } end of match

這是我當前正在使用的模式:

\w+\s+func\s\w+\(\)\{\s+(.*?)\s+\}

也許是利用.NET平衡組 (以處理那些令人討厭的嵌套,未知級別的{}事物{}

\bfunc\s*\w+\([^)]*\)\s*{(?:[^{}]|(?<Open>{)|(?<-Open>}))*(?(Open)(?!)\}

最酷的部分是(?:[^{}]|(?<Open>{)|(?<-Open>}))*(?(Open)(?!)譯為:吃一個非{} ,或吃{ ,最后是} (三向交替的第三個選項)(注意減號,名稱無關緊要),這會彈出堆棧並“關閉”該組。由於* ,模式可以自由匹配盡可能多的次數,但是任何{都必須用相同數量的}進行匹配,否則模式將通過最后一個條件(通過檢查“打開”組以及是否通過它仍然保留所有匹配項,並執行空的超前保證,以確保整個操作失敗。

一個可能的解決方案是,您必須對點使用單行匹配以匹配換行符:

func\s*.*\s*{\n.*?((?!\{.*\}).)*}

在這里,您將func關鍵字和第一個左括號匹配。 然后,使用否定的前瞻,不允許在該行上使用另一個左括號,而后跟要查找的右括號。

您甚至可以嵌套更多的打開/關閉方括號,它將與最后一個關閉方括號匹配。

你可以在這里測試

有關更多信息,請參見此問題。

如果只存在一個嵌套括號,則此模式應該適用於您:

\w[\w\s]+func[\w\s()]+({(?:[^{}]*|[\w\s();]*?{[\w\s();]*?}[\w\s();]*?)*})

看到它在Regex101上實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM