得到这样的文字:
Want this || Not this
该行也可能如下所示:
Want this | Not this
用一根管子。
我使用这个语法来解析它:
grammar HC {
token TOP { <pre> <divider> <post> }
token pre { \N*? <?before <divider>> }
token divider { <[|]> ** 1..2 }
token post { \N* }
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?我很乐意能够做更多这样的事情:
grammar HC {
token TOP { <pre> <divider> <post> }
token pre { \N*? }
token divider { <[|]> ** 1..2 }
token post { \N* }
}
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。如果我这样做:
grammar HC {
token TOP { <pre>* <divider> <post> }
token pre { \N }
token divider { <[|]> ** 1..2 } }
token post { \N* }
}
Run Code Online (Sandbox Code Playgroud)
分隔符之前的每个字符都有自己的<pre>捕获。谢谢。
一如既往,蒂姆托威迪。
我很想能够做更多这样的事情
你可以。只需将前两个规则声明从 切换token为regex:
grammar HC {
regex TOP { <pre> <divider> <post> }
regex pre { \N*? }
token divider { <[|]> ** 1..2 }
token post { \N* }
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为regex禁用:ratchet(token与rule启用它不同)。
(解释为什么你需要关闭这两条规则超出了我的工资水平,当然是今晚,而且很可能直到其他人向我解释原因,这样我就可以假装我一直都知道。)
如果我这样做...每个角色都有自己的
<pre>捕获
默认情况下,“调用命名正则表达式会安装具有相同名称的命名捕获” [...稍后几句话:]“如果不需要捕获,则前导点或与号将抑制它”。所以<pre>改成<.pre>.
接下来,您可以通过将模式包装$<name>=[pattern]在. 因此,要捕获与规则的连续调用匹配的整个字符串pre,请将非捕获模式 ( <.pre>*?) 包装在$<pre>=[...]) 中:
grammar HC {
token TOP { $<pre>=[<.pre>*?] <divider> <post> }
token pre { \N }
token divider { <[|]> ** 1..2 }
token post { \N* }
}
Run Code Online (Sandbox Code Playgroud)