我想要一个在是否存在空格方面宽松的语法...我想匹配:
this ' <foo> <bar> <baz> '
and also this '<foo><bar><baz>'
这有效:
token TOP { \s* <foo> \s* <bar> \s* <baz> \s* }
但读完所有内容后:信号空间, <.ws> and rule我可以想象有一种方法可以在不重复 *\s 的情况下做到这一点。
(即。如何在 per6 语法中匹配十六进制数组)
请有人告诉我是否有更好的方法在 perl6 语法中做到这一点?
注意。这不是通过简单地改变token声明者rule- 当我尝试这种方法时,我最终得到了either匹配空格或没有空格(但不是both) 在解析字符串中。
也许您的问题是这三个规则“gotchyas”之一:
如果您想要空白/标记边界匹配at the start的一条规则,before the first atom, 你必须明确地提供它(通常带有明确的<.ws>
).
如果您想要空白/标记边界匹配betweena 的每场比赛量化的 atom (eg <foo>*
)您必须在原子和量词之间包含空格(例如<foo> *
).
默认<ws>
定义为regex ws { <!ww> \s* }
。如果你想rule
在特定语法中使用不同的模式,然后在该语法中定义您自己的模式。 (蒂莫蒂莫++)
有关上述内容的进一步讨论,请参阅我的更新答案如何在 per6 语法中匹配十六进制数组.
以下四个正则表达式与您的两个示例字符串匹配:
my \test-strings := ' <foo> <bar> <baz> ', '<foo><bar><baz>';
my \test-regexes := token { \s* '<foo>' \s* '<bar>' \s* '<baz>' \s* },
rule { \s* '<foo>' \s* '<bar>' \s* '<baz>' \s* },
rule { \s* '<foo>' '<bar>' '<baz>' },
rule { <.ws> '<foo>' '<bar>' '<baz>' }
say (test-strings X~~ test-regexes).all ~~ Match # True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)