2013-05-06 101 views
8

因此,我對於Regex這個壓倒性的世界是全新的。基本上,我使用Gedit API爲語法突出顯示(對於Byond的DM)創建新的自定義語言規範(從C#派生)。在DM中的轉義字符中,必須使用[變量]作爲轉義語法,這很簡單。但是,它也可以是嵌套的,例如[array/list [index]]。 (它可以無限嵌套。)我研究過其他問題,當他們詢問嵌套括號時,它們只意味着嵌套,而在這種情況下,它可能是/或。正則表達式(正常或嵌套括號)

多次嘗試我試過:

  • \[.*\]產生的結果爲 「測試[測試[測試]測試]測試[測試]測試」
  • \[.*?\]產生的結果爲「測試[測試[測試]測試]測試[測試]測試 「
  • \[(?:.*)\]produces結果」 測試[試驗[測試]測試]測試[測試]測試」
  • \[(?:(?!\[|\]).)*\]produces結果 「測試[試驗[測試]測試]測試[測試]測試」。這是從https://stackoverflow.com/a/9580978/2303154派生的,但如上所述,只有在內部沒有括號時才匹配。

很顯然,我沒有真正的想法,我在這裏做更復雜的匹配,但至少我更瞭解其他來源的基本操作。

+3

仔細閱讀[本教程](http://www.regular-expressions.info/tutorial.html)使正則表達式的世界不那麼令人難以置信。此外,嵌套結構通常是正則表達式接近崩潰的地方 - 只有.NET的正則表達式風格和PCRE支持結構可以處理不確定的嵌套。 – 2013-05-06 21:39:25

+0

不幸的是,由於它是一個API,我不認爲我可以區分,只需要使用Gedit具有XML匹配的功能; - ;.是的,這是我一直在看的主要教程之一。 – Chaos7Theory 2013-05-06 23:51:24

+0

您的第三次和第四次嘗試在語法上格式錯誤(因此您的測試字符串中沒有任何匹配項)。我糾正了他們。 #3:您的版本'\ [(?:。*))\]'有一個重複的右括號。校正'\ [(?:。*)\]'等同於#1。 _non-capturing group_'(?:...)'在這裏沒有明顯的目的。 #4:您的版本'\ [?:(?!\ [| \])。* \]'是非捕獲組語法的一部分 - '?:' - 沒有相應的括號'(...)'。 '(?:(?!\ [| \])。)'可以簡化爲'[^ \] \ []'(按照以下順序列出charclass的字符時,反斜槓是可選的:'[^] []' )。 – 2014-03-15 14:27:47

回答

1

@Chaos7Theory

在閱讀GtkSourceView's Specification Reference,我已經想通了,它採用專門PCRE。然後我用它作爲主角。

挖掘到它,並通過試錯,我得到它一起工作:

\[(([^\[\]]*|(?R))*)\]

我希望這可以幫助別人,將來別人。

+0

@ Chaos7Theory:感謝您對此進行研究並共享解決方案! @亞歷克斯:感謝您將它移動到適當的答案! – 2014-03-15 14:39:19