Algorithm 如何实现逃逸

Algorithm 如何实现逃逸,algorithm,escaping,Algorithm,Escaping,前言:我不是在问什么是逃避以及如何使用逃避 假设您编写了自己的简单“脚本语言”,或者更确切地说,您只想实现一些神奇的单词(变量)。以简单的方式(伪语言): 看起来很简单 现在想象一下,有人将“$b”放入a会发生的情况是,$a被替换为“$b”,而“world”是字符串中的两倍 另外,如果有人想在文本中按字面意思写“$a”(不是可变的),该怎么办。大多数语言都提供某种转义,我想转义,例如使用反斜杠。因此,在最后一个字符串中“\$a”将变成“$a” 实现这一点(正确地)最简单的方法是什么 我可以想象很

前言:我不是在问什么是逃避以及如何使用逃避

假设您编写了自己的简单“脚本语言”,或者更确切地说,您只想实现一些神奇的单词(变量)。以简单的方式(伪语言):

看起来很简单

现在想象一下,有人将“$b”放入
a
会发生的情况是,$a被替换为“$b”,而“world”是字符串中的两倍

另外,如果有人想在文本中按字面意思写“$a”(不是可变的),该怎么办。大多数语言都提供某种转义,我想转义,例如使用反斜杠。因此,在最后一个字符串中“\$a”将变成“$a”

实现这一点(正确地)最简单的方法是什么

我可以想象很多方法来实现这一点,但它们大多相当复杂和低效。因此,我希望看到一个合适的解决方案,而不是重新发明轮子

请不要使用库和语言中性。

您不必“首先替换所有
$a
”,原因正是您所描述的。相反,您可以从左到右扫描loking以查找任何替换模式。在所有变量都是单个字母的简单语言中,“替换模式”可能只是一个$后跟一个字符。找到模式后,就可以确定要用哪个变量替换它。替换后,您将继续使用模板字符串的其余部分。所以所有东西只扫描一次

正则表达式库和扫描程序生成器非常方便。许多语言(python、perl、lua、ecmascript等)都有一个搜索和替换库函数,其搜索参数是正则表达式,替换参数是函数;使用匹配的子字符串调用该函数,并返回替换字符串。这将涵盖许多简单的语法

对于更复杂的语法,(f)类似于lex的扫描生成器可以轻松创建传感器,从而实现更一般的相同想法。(它更通用,因为它不限于使用单个正则表达式。)


这些都与转义无关,因为您不需要转义来避免多次替换。您只需避免重新扫描即可。然而,可以用完全相同的方法处理显式转义;显式转义语法只是添加到一组可能的替换模式中,以及生成替换值的适当操作。(例如,用一个特殊字符替换\后跟该字符。)

这就是您想要支持的所有字符吗?太宽了。。。如果在任何特定的语言中出现问题,您可以立即匹配所有替换标记(即使用
$[a-z]
正则表达式)并立即替换所有标记……我认为这方面没有什么广泛的内容,实现转义的每种语言都需要解决这个问题,因此需要存在一些通用的解决方案。如果可能的话,我希望避免使用正则表达式。您提出了两个不同的问题:(1)如果替换字符串包含“replace”标记,会发生什么情况,以及(2)如何在输出中生成“替换”标记。您应该将其分为两个单独的帖子。@a.I.Breveleri OP没有提出两个问题。正确实现转义需要这两个要求。
var a = "hello";
var b = "world";
var string = "this is a string with variable $a and $b";
string = string.replace("$a", a).replace("$b", b);