PreAMBLE:我不是在问什么是逃避以及如何使用它
想象一下,你编写自己的简单“脚本语言”,或者更确切地说,你只想实现一些魔术词(变量)。以简单的方式(伪语言):
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);
看起来很简单。
现在想象一下,有人会将“$ b”加入a
会发生的事情是$ a被“$ b”取代而“world”是字符串的两倍。
此外,如果有人想在文本中输入“$ a”(不是变量),该怎么办?大多数语言提供某种转义,我想逃避这一点,例如使用反斜杠。因此,“\ $ a”将在最终字符串中变成“$ a”。
实现这一点(正确)的最简单方法是什么。
我可以想象很多方法如何实现这一目标,但它们大多相当复杂且效率低下。因此,我希望看到一个合适的解决方案,而不是重新发明轮子。
请不要使用图书馆和语言。
答案 0 :(得分:2)
您不会首先替换所有$a
",正是您所描述的原因。而是从左到右扫描任何替换模式。在你简单的语言中,所有变量都是单个字母,a"替换模式"可能只是一个 $ 后跟一个字符。找到模式后,您可以找出要替换它的变量。更换后,继续使用模板字符串的其余部分。所以一切都只扫描一次。
正则表达式库和扫描仪生成器非常方便。许多语言(python,perl,lua,ecmascript,...)都有一个搜索和替换库函数,其搜索参数是一个正则表达式,其替换参数是一个函数;使用匹配的子字符串调用该函数并返回替换字符串。这将涵盖许多简单的语法。
对于更复杂的语法,(f)类似lex的扫描仪生成器可以轻松创建传感器,从而可以更一般地实现相同的想法。 (它更通用,因为它不仅限于使用单个正则表达式。)
这些都与逃避无关,因为您不需要逃避以避免多次替换。您只需要避免重新扫描。但是,显式转义可以用以完全相同的方式处理;显式转义语法只是添加到可能的替换模式集中,以及生成替换值的适当操作。 (例如,将 \ 替换为仅包含该字符的特殊字符。)