我想要一个语法,它是否存在空格...我想匹配:
this ' <foo> <bar> <baz> '
and also this '<foo><bar><baz>'
这有效:
token TOP { \s* <foo> \s* <bar> \s* <baz> \s* }
但是,在阅读了有关:sigspace, <。ws> 和 rule 的全部知识之后,我可以想象有一种方法可以做到重复的* \ s。 (即How do I match a hex array in per6 grammar)
请问有人可以用perl6语法告诉我更好的方法吗?
NB。这不能通过简单地将 token 声明符更改为 rule 来解决-当我尝试这种方法时,我最终会匹配空间或没有空间的 (但是而不是都是)。
答案 0 :(得分:11)
也许您的问题是这三个规则“ gotchyas”之一:
如果要在规则的开始处匹配空白/令牌边界,请在第一个原子之前 ,您必须明确地提供它(通常带有明确的<.ws>
)。
如果要在量化的原子的每个匹配项之间 (例如{{1 }}),您必须在原子和量词(例如<foo>*
)之间包含空格。
默认的<foo> *
定义为<ws>
。如果您希望特定语法中的regex ws { <!ww> \s* }
使用不同的模式,请在该语法中定义自己的语法。 (timotimo ++)
有关上述内容的进一步讨论,请参阅我对How do I match a hex array in per6 grammar的更新答复。
以下四个正则表达式匹配您的两个示例字符串:
rule