我想将单个 Ruby 风格的字符串与replacements匹配,如下所示:
"some ugly text #{Class.new().method("argument")}"
正如您可能看到的,令人讨厌的是它允许双引号出现在模板中而不会转义。
我需要将角双引号之间的整个文本作为单个字符串捕获。不需要进一步处理replacements
。
我想用一个正则表达式来提供我的简单标记器。
以下似乎工作:
>>> check = re.compile(r'("((#\{([^}]|["])*\})|\\.|[^"])*")|(\'(\\.|[^\'])*\')').match
>>> check('"Text"').end()
6
>>> check('"Text #{}"').end()
10
>>> check('"Text #{"}"').end()
11
>>> check('"Text #{""}"').end()
12
>>> check('"Text #{"foo"}"').end()
16
有时只是问问题有助于解决问题。我的标记器开始使用该正则表达式正常工作,因此问题解决了。
棘手的部分是([^}]|["])*
它消耗了里面的东西replacement
,被包围着#{}
,给了#\{([^}]|["])*\}
。我目前不需要双花括号。
最后一部分使用单引号中的字符串,所以不要感到惊讶。