2013-05-06 171 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