我正在构建一个代码生成器,一旦我用我必须使用的语言编写模板和/或翻译,我就会为我生成样板。
我在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]]);
} }}}
为了存储我的翻译,我应该使用正则表达式,比如
我希望构建一些有点聪明的东西,因此它可以构建大多数基本代码而不会出错。所以我可以处理有趣的代码。
答案 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"]]
如果你需要子阵列。
我在试图在正则表达式中尝试一切可能性并不大。我喜欢保持简短和甜美,然后在找到我想要的东西后抛光输出。这是一个维护问题,因为正则表达式让我的头部受到伤害,而且几年前我就不再把它们想象成一个男子汉。正则表达式是一个非常有用的工具,但它们往往被视为每个问题的答案,而不是它们。
有些人在面对问题时会想“我知道, 我将使用正则表达式。“现在他们有两个问题。
答案 2 :(得分:1)
答案 3 :(得分:1)
您想要非捕获组(?:...)
,但这是另一种方式。
/\{\{\{(.*?)\}\}\}/m