Notepad++查找/替换中的功能图灵机

2022-02-22 17:52:27

我使用Notepad++及其查找/替换正则表达式引擎创建了一个运行正常的图灵机。看看busybeaver。Notepad++中的txt或(几乎)任何其他带有regex find/replace选项的文本编辑器。

机器由磁带、读/写磁头、当前指令和指令集组成。

这盘磁带是以a开头的一行!后跟一个0和1的字符串。

读/写头是一行,以[开头,后跟预设的空白量,以^结尾。

当前指令是一行,以#开头,后跟当前指令的名称。

指令集是剩余的行,格式为>;C.I:WMN I当前磁带位置的输入。0或1。每条指令都有两个输入的执行参数。

W在当前位置写入磁带的输出。0或1。

M读/写磁头的运动。0将头部向左移动一个位置。A 1将其向右移动。

N在新磁带位置执行的下一条指令的名称。

该机器当前处于指令指令指令中,当前磁带位置包含1。

INST.1定义了以下指令:写入0,向右移动头部,转到INST指令。

在用0覆盖磁带并将磁头向右移动后,新的磁带位置将包含0,我们仍将使用指令指令INST。

INST.0定义了以下指令:写入0,向左移动磁头,转到指令暂停。

因为此时磁带已经包含0,所以磁带的内容不会更改。将头部向左移动后,我们进入指令暂停。由于没有使用此名称定义指令集,因此机器将停止运行。

一旦正则表达式不再找到匹配项,并且replace停止工作,机器就会停止运行。

提示:为了节省一些点击时间,您可以单击“替换”一次,然后按住键盘上的Enter键以快速执行许多指令。

正则表达式匹配磁带、读/写磁头和当前指令。在每次指令迭代中,所有这些内容都会被find/replace框的内容替换。

正则表达式中括号内的所有内容都称为组。第四组括号可以稍后在表达式中用\4引用。在这种情况下,\ 4是当前指令集的名称,\ 2是当前磁带位置的值。向前看会经过每一行文本,直到找到以>\4\.\2:然后它可以对其进行解析,以获取执行当前指令所需的信息。

\3磁带的其余部分、换行、所有读/写磁头行、换行、#

\8为了移动磁头,需要修改磁带的开头(解释如下)

这些组用于拼凑查找/替换的替换部分。大部分信息保持不变,但一些关键元素会根据前瞻在当前指令中找到的内容进行修改。

要向左或向右移动磁头,请在磁带开头插入0,或从磁带开头删除0。当读/写磁头保持静止时,它会向左或向右滚动磁带。在当前的实现中,只要我们想读取当前位置,读/写磁头就会查看磁带的第22个元素。对于使用长磁带的复杂机器,您需要增加这个数字,这样在滚动时就不会删除必要的磁带元素。这可以通过增加表达式开头的{20}来实现。要使所有内容都正确显示,请确保增加磁带的长度,并将表示读/写磁头的“^”移动到下一行。

这实质上是在指令中表示移动的位置上匹配(0或1)。但按照分组与|运算符结合使用的方式,这将导致以下结果:

如果移动指令为1,则\8将包含空字符串,因为|右侧没有第8组。

我们利用这一点,将磁带的第一个元素(必须是0)替换为\8\8。如果我们考虑以下磁带:

0(左)的移动指令将用00替换磁带上的第一个0:

移动指令1(右)将用两个空字符串替换磁带上的第一个0:

替换两个0或两个空字符串会导致功能区在读/写磁头上方向左或向右滚动。