1

我想创建一个能够获取brainfuck代码中的每个循环的正则表达式。

假设给出了这段代码:

++++[>+[>,++.]<<-]++[>,.<-]

我想获取这三个循环(实际上只获取第一个循环就足够了):

[>+[>,++.]<<-]
[>,++.]
[,.<-]

我对正则表达式的了解很薄弱,所以除了基础知识我无能为力。我想到的是这样的表达:

\[[-+><.,\[\]]*]

\[            - Match the first (opening) bracket
[-+><.,\[\]]* - followed by a number of brainfuck operators
]             - followed by a closing bracket

然而,这匹配(显然)第一个开头和最后一个右括号之间的所有内容:

[>+[>,++.]<<-]++[>,.<-]

在匹配最后一个右括号之前,它可能需要测试循环内相同数量的左括号和右括号 - 如果这有任何意义。

也许环顾四周(我需要在 javascript 中使用它,所以我只能使用lookaheads)是正确的方法,但我无法弄清楚它应该如何完成。

4

3 回答 3

1

正则表达式不能匹配无限递归的东西。看看乔姆斯基的语言层次结构。

您可以通过扩展它们来编写匹配有限递归事物的正则表达式。例如,这个 POSIX ERE(用 egrep 测试)将匹配到嵌套深度 3 的 Brainfuck 循环:

(\[[^][]*\]|\[([^][]|\[[^][]*\])*|\[([^][]|\[([^][]|\[[^][]*\])*\])*\])
于 2014-12-23T23:59:47.030 回答
1

当我需要匹配一对方括号(同时正确处理嵌套时)时,我曾经写过这个

它是一个 .NET 正则表达式,它使用了所有正则表达式引擎中不可用的一些功能。开始:

\[(?>\[(?<d>)|\](?<-d>)|.?)*(?(d)(?!))\]
于 2014-07-10T12:03:47.880 回答
0

使用非贪婪(或惰性)匹配:

\[[-+><.,\[\]]*?\]

注意?. 不过,它将匹配 和 之间的最短[字符串]。因此,结果之一是:

[>+[>,++.]
于 2014-07-09T12:02:55.430 回答