【发布时间】: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