【问题标题】:Regular Expressions (Normal OR Nested Brackets)正则表达式(普通或嵌套括号)
【发布时间】:2013-05-06 20:15:30
【问题描述】:

所以我对 Regex 的压倒性世界完全陌生。基本上,我使用 Gedit API 创建一个新的自定义语言规范(源自 C#),用于语法高亮(用于 Byond 的 DM)。在 DM 中的转义字符中,您必须使用 [variable] 作为转义语法,这很简单。但是,它也可以嵌套,例如 [array/list[index]]。 (它可以无限嵌套。)我查看了其他问题,当他们询问嵌套括号时,它们仅表示完全嵌套,而在这种情况下它可能是非此即彼。

我尝试了几次:

  • \[.*\] 产生结果“Test [Test[Test] Test]Test[Test] Test”
  • \[.*?\] 产生结果“Test [Test[Test] Test]Test [Test] Test”
  • \[(?:.*)\] produces 结果“测试[Test[Test]Test]Test[Test]Test”
  • \[(?:(?!\[|\]).)*\] produces 结果“测试 [Test[Test] Test]Test[Test] Test”。这是从 https://stackoverflow.com/a/9580978/2303154 派生的,但就像上面提到的那样,只有在里面没有括号时才匹配。

显然我不知道我在更复杂的匹配中在这里做什么,但至少我从其他来源了解了更多的基本操作。

【问题讨论】:

  • 仔细阅读this tutorial 让正则表达式的世界不再那么不堪重负。此外,嵌套结构通常是 regex 方法崩溃的地方 - 只有 .NET 的 regex 风格和 PCRE 支持可以处理无限嵌套的结构。
  • 不幸的是,因为它是一个 API,我认为我无法区分,只需要使用 Gedit 对 XML 所做的匹配,;-;。是的,那是我一直在看的主要教程之一。
  • 您的第 3 次和第 4 次尝试语法格式错误(因此与您的测试字符串中的任何内容都不匹配)。我纠正了他们。 #3:您的版本\[(?:.*))\] 有一个重复的右括号。更正\[(?:.*)\] 等同于#1。 非捕获组 (?:…) 在这里没有明显的用途。 #4:您的版本 \[?:(?!\[|\]).*\] 包含非捕获组语法的一部分 - ?: - 没有相应的括号 (…)(?:(?!\[|\]).) 可以简化为 [^\]\[](反斜杠在按此顺序列出 charclass 的字符时是可选的:[^][])。
  • “仅嵌套括号”与“非此即彼”是什么意思?您所说的“排他性”是指 [[[Test]]],而 [x[[Test]]] 是“非排他性”的吗?

标签: regex nested pcre brackets


【解决方案1】:

来自@Chaos7Theory

在阅读GtkSourceView's Specification Reference 后,我发现它专门使用 PCRE。然后我用它作为线索。

深入研究并通过反复试验,我得到了它的使用:

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

我希望这对将来的其他人有所帮助。

【讨论】:

  • @Chaos7Theory:感谢您对此进行研究并分享解决方案! @Alex:感谢您将其移至正确的答案!
猜你喜欢
  • 2020-02-14
  • 2014-10-09
  • 2020-04-27
  • 2013-06-14
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多