2013-07-26 62 views
-1

我想单红宝石风格的字符串替换匹配,看起来像:匹配全红宝石风格的字符串_replacements_在Python

"some ugly text #{Class.new().method("argument")}"

正如你可以看到讨厌的事情是,它允许双引号出现在模板中,而不用转义。

我需要将角落双引号之间的整个文本捕获为单个字符串。不需要进一步处理replacements

我想在一个正则表达式中为我的简单分词器提供动力。

+0

回答此问题的人:请注意,ruby允许在转义部分使用大括号:'“有趣的事情:#{{hash:'in'string''}}”' – tessi

+0

你怎么做你的tokenizer ...肯定该语法将在一个引用字符串中,一个#{直到一个未转义的}是一个替换,这意味着你应该在#{和}上“标记化”......否则,你不是真正的标记化,你试图解析使用正则表达式,这不是一个好主意 –

+0

我不写新的Ruby - 我需要双引号之间的文本内容,没有任何处理。只是内容。看来我找到了解决方案。 –

回答

0

以下似乎工作:

>>> 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内部的东西,包围#{},给出#\{([^}]|["])*\}。我目前不需要双曲花括号。

最后部分消耗单引号中的字符串,所以不要感到惊讶。