【发布时间】:2017-11-10 20:35:23
【问题描述】:
在学习了how to pass regexes as arguments 之后,我尝试使用sub 构建我的第一个正则表达式,但我再次陷入困境。很抱歉下面的复杂规则,我已尽力简化它们。我至少需要一些线索来解决这个问题。
regex 应该由交替组成,每个交替由 left、middle 和 right 组成,其中 left 和 right 应该成对出现,middle 的变体取决于选择了right。
Pairs 数组包含一对 left 和 right:
my Pair @leftright =
A => 'a',
...
Z => 'z',
;
Middle 变体从哈希中读取:
my Regex %middle =
z => / foo /,
a => / bar /,
m => / twi /,
r => / bin /,
...
;
如果right 是z、%middle<a>,则应选择%middle<z> — 如果right 是a 等。
所以,生成的正则表达式应该是
my token word {
| A <%middle[a]> a
| Z <%middle[z]> z
| ...
}
或者,更一般地
my token word {
| <left=@leftright[0].key>
<middle=%middle{@leftright[0].value}>
<right=@leftright[0].value>
| (the same for index == 1)
| (the same for index == 2)
| (the same for index == 3)
...
}
它应该匹配Abara 和Zfooz。
如何构建token word(可以在例如grammar中使用)和sub,它将从@leftright中获取每一对,根据right的值放置合适的%middle{}然后将它们合并为一个regex?
my Regex sub sub_word(Pair @l_r, Regex %m) {
...
}
my token word {
<{sub_word(@leftright, %middle)}>
}
比赛结束后我需要知道left、middle和right的值:
"Abara" ~~ &word;
say join '|', $<left>, $<middle>, $<right> # A|bar|a
【问题讨论】:
-
听起来你在说什么,大意是,给定一个权利是
X,中间是/ waldo /。但是您还没有说应该在X和waldo之间检测到什么程序关系。 (当然,您写了z而不是X和/ zfoo /而不是/ waldo /,但这没有区别,除非您的意思是/ zfoo /中的z不仅是为了帮助人类理解,而且也是被程序检测到。在这种情况下,不,我认为你不能这样做——我认为你的程序不能内省地知道/ zfoo /模式包含z。) -
应该构建令牌
word的子组件的输入参数是什么?应该在正则表达式解析开始构建预定义的token之前使用 sub,还是应该在正则表达式解析器中使用它?能举个简单的例子吗? -
@raiph 谢谢这是我的错(我考虑过),我并不是要反省
regex。我将重新表述这部分,制作一个hash。 -
@HåkonHægland 输入参数应该是
@leftright和%middle,并且应该在解析开始之前构建模式。如果只有一个变体,则模式将类似于<$left> <$middle> <$right>。这里应该是<@leftright[0].key> <%middle{@leftright[0].value}> <@leftright[0].value> | (the same for index == 1 | then 2, 3 etc)...所以问题是我例如不知道如何在循环中连接regexes和交替|。 -
我已经修改了问题的文本。希望,现在好多了。
标签: raku