PEG.js 获取 ( 和 ) 之间的任何文本;
PEG.js Get any text between ( and );
我试图在末尾用分号的括号之间捕捉一些文本。
示例:(in here there can be 'anything' !"#¤);); any character is possible);
我试过这个:
Text
= "(" text:(.*) ");" { return text.join(""); }
但似乎 (.*) 将包含最后一个 );前 ”);”确实如此,但我得到了错误:
Expected ");" or any character but end of input found
问题是文本可以包含");"所以我想要最外面的);决定线路何时结束。
这个正则表达式 \((.*)\);
可以满足我的要求,但我如何才能在 PEG.js 中达到同样的效果?我不想在结果中包含外括号和分号。
如果你知道自己在做什么,这看起来应该很容易=P
所以,重点是 PEG 是确定性的,而正则表达式不是。因此,一旦 PEG 接受了一些输入,它就不会回溯。然后我们可以模拟你想要的语义。既然你说正则表达式 \((.*)\);
做你想做的,我们可能会将其转换为 PEG。
这个正则表达式有什么作用?它消耗所有字符直到输入结束,然后继续回溯直到它看到 );
,即它消耗最后一个可能的 );
.
为了使用 PEG 进行这项工作,我们可以使用前瞻来继续消费,前提是我们有 );
提前。
所以,一个解决方案是:
Text
= "(" text:TextUntilTerminator ");" { return text.join(""); }
TextUntilTerminator
= x:(&HaveTerminatorAhead .)* { return x.map(y => y[1]) }
HaveTerminatorAhead
= . (!");" .)* ");"
TextUntilTerminator
非终结符消耗,而 HaveTerminatorAhead
匹配而不消耗它 (向前看,&
符号)。然后它消耗一个字符。它会一直这样做,直到它知道我们已经到达输入的最终 );
。
HaveTerminalAhead
非终结符很简单:它验证前面是否有一个字符,如果有,则保证其后至少有一个 );
。我们还使用负前瞻 !
在我们看到的第一个 );
处停止(避免使用它,这会重现您的原始问题)。
然后,此 PEG 将重现您建议的正则表达式的行为。
我试图在末尾用分号的括号之间捕捉一些文本。
示例:(in here there can be 'anything' !"#¤);); any character is possible);
我试过这个:
Text
= "(" text:(.*) ");" { return text.join(""); }
但似乎 (.*) 将包含最后一个 );前 ”);”确实如此,但我得到了错误:
Expected ");" or any character but end of input found
问题是文本可以包含");"所以我想要最外面的);决定线路何时结束。
这个正则表达式 \((.*)\);
可以满足我的要求,但我如何才能在 PEG.js 中达到同样的效果?我不想在结果中包含外括号和分号。
如果你知道自己在做什么,这看起来应该很容易=P
所以,重点是 PEG 是确定性的,而正则表达式不是。因此,一旦 PEG 接受了一些输入,它就不会回溯。然后我们可以模拟你想要的语义。既然你说正则表达式 \((.*)\);
做你想做的,我们可能会将其转换为 PEG。
这个正则表达式有什么作用?它消耗所有字符直到输入结束,然后继续回溯直到它看到 );
,即它消耗最后一个可能的 );
.
为了使用 PEG 进行这项工作,我们可以使用前瞻来继续消费,前提是我们有 );
提前。
所以,一个解决方案是:
Text
= "(" text:TextUntilTerminator ");" { return text.join(""); }
TextUntilTerminator
= x:(&HaveTerminatorAhead .)* { return x.map(y => y[1]) }
HaveTerminatorAhead
= . (!");" .)* ");"
TextUntilTerminator
非终结符消耗,而 HaveTerminatorAhead
匹配而不消耗它 (向前看,&
符号)。然后它消耗一个字符。它会一直这样做,直到它知道我们已经到达输入的最终 );
。
HaveTerminalAhead
非终结符很简单:它验证前面是否有一个字符,如果有,则保证其后至少有一个 );
。我们还使用负前瞻 !
在我们看到的第一个 );
处停止(避免使用它,这会重现您的原始问题)。
然后,此 PEG 将重现您建议的正则表达式的行为。