Ruby,正则表达式,句子

时间:2012-09-20 15:34:21

标签: ruby regex

我正在构建一个代码生成器,一旦我用我必须使用的语言编写模板和/或翻译,我就会为我生成样板。

我在Ruby中使用正则表达式时遇到问题。正则表达式旨在选择{{{}}}之间的任何内容,因此我可以根据自己的需要生成函数。

我的正则表达式目前是:

/\{\{\{(([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 个答案:

答案 0 :(得分:4)

你有一组捕获括号太多了。

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

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

答案 1 :(得分: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"]]

如果你需要子阵列。

我在试图在正则表达式中尝试一切可能性并不大。我喜欢保持简短和甜美,然后在找到我想要的东西后抛光输出。这是一个维护问题,因为正则表达式让我的头部受到伤害,而且几年前我就不再把它们想象成一个男子汉。正则表达式是一个非常有用的工具,但它们往往被视为每个问题的答案,而不是它们。

  

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

- Jamie Zawinski

答案 2 :(得分:1)

只需一枪

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

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

Here这似乎有用

答案 3 :(得分:1)

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

/\{\{\{(.*?)\}\}\}/m