0

我目前正在构建一个代码生成器,旨在在我编写模板和/或翻译后为我生成样板,无论我使用什么语言。

我对 Ruby 中的正则表达式有疑问。正则表达式旨在选择介于{{{and之间的任何内容}}},因此我可以根据需要生成函数。

我的正则表达式目前是:

/\{\{\{(([a-zA-Z]|\s)+)\}\}\}/m

我的测试数据集是:

{{{Demande    aaa}}} => {{{tagadatsouintsouin    tutu}}}

结果是:

[["Demande aaa", "a"], ["tagadatsouintsouin tutu", "u"]]

每次正则表达式选择最后一个字符两次。这不是我想要的,我需要更像这样的东西:

/\{\{\{((\w|\W)+)\}\}\}/m

但这也有一个缺陷,结果是:

[["Demande aaa}}} => {{{tagadatsouintsouin tutu", "u"]]

鉴于,我希望得到:

[["Demande aaa"],["tagadatsouintsouin tutu"]]

如何更正这些正则表达式?我可以使用两组分隔符,但它不会教我任何东西。

编辑 :

您所有的正则表达式都针对我的数据样本运行,所以你们都明白了。

正则表达式可能是矫枉过正,可能是矫枉过正我的目的。所以我有两个问题。

首先,正则表达式是否保持相同的缩进?这应该能够处理整个功能。

其次,是否有更适合该任务的东西?

详细说明此工具的用途。我很无聊在 php - symfony 中编写样板代码。所以我希望根据模板生成这个。

我的意图是以这种方式构建一些视图、一些控制器,甚至是模型的一部分。

实际示例:在我的模型中,我希望根据对象属性的类型生成一些函数。例如,我有正确显示货币的功能。所以我需要根据我的属性构建 corect 函数,然后放入 m 输出文件中。

所以有些翻译本身需要翻译。

所以一个虚构的例子:

{{{euro}}} => {{{ function getMyAttributeEuro()
 {
   return formating($this->get[[MyAttribute]]);
 } }}}

为了储存我的翻译,我应该使用正则表达式吗,比如

我希望构建一些有点聪明的东西,这样它就可以构建大部分没有错误的基本代码。所以我可以编写有趣的代码。

4

4 回答 4

4

您的一组捕获括号太多。

/\{\{\{([a-zA-Z\s]+)\}\}\}/

此外,您不需要/m修饰符,因为您的正则表达式中没有点 ( .),其行为会受到它的影响。

于 2012-09-20T15:38:30.070 回答
2

我偏爱:

data = '{{{Demande    aaa}}} => {{{tagadatsouintsouin    tutu}}}'
data.scan(/\{{3}(.+?)}{3}/).flatten.map{ |r| r.squeeze(' ') }
=> ["Demande aaa", "tagadatsouintsouin tutu"]

或者:

data.scan(/\{{3}(.+?)}{3}/).flatten.map{ |r| [ r.squeeze(' ') ] }
=> [["Demande aaa"], ["tagadatsouintsouin tutu"]]

或者:

data.scan(/\{{3}(.+?)}{3}/).map{ |r| [ r[0].squeeze(' ') ] }
=> [["Demande aaa"], ["tagadatsouintsouin tutu"]]

如果您需要子阵列。

我不太愿意尝试正则表达式中的一切可能。我更喜欢让它简短而甜美,然后在找到我想要的东西后完善输出。这是一个维护问题,因为正则表达式让我头疼,几年前我不再认为它们是男子气概的东西。正则表达式是一个非常有用的工具,但它们往往被视为每个问题的答案,而事实并非如此。

有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

——杰米·扎温斯基

于 2012-09-20T19:43:52.770 回答
1

您想要非捕获组(?:...),但这是另一种方式。

/\{\{\{(.*?)\}\}\}/m
于 2012-09-20T15:40:11.393 回答
1

只是一个镜头

/\{\{\{([\w\W]+?)\}\}\}/

为您的正则表达式添加非贪婪

在这里这似乎工作

于 2012-09-20T15:36:47.033 回答