我想用替换来匹配单个Ruby风格的字符串,看起来像:
"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
内部的东西,被#{}
包围,得到了#{([^}]|["])*}
。我现在不需要双花括号。
最后一部分使用单引号中的字符串,所以不要感到惊讶。