Javascript 获取(和)之间的任何文本;

Javascript 获取(和)之间的任何文本;,javascript,regex,peg,pegjs,Javascript,Regex,Peg,Pegjs,我试图抓住一些在结尾处带有分号的意合之间的文本 示例:(在这里可以是'anything'!“#·);;任何字符都可以); 我试过这个: Text = "(" text:(.*) ");" { return text.join(""); } 但似乎(*)将包括最后一个;之前);“是否和我得到错误: 预期的“);“或找到输入结尾以外的任何字符 问题是文本可能包含“);“因此,我希望最外层的部分在线条结束时进行描述 这个regex\(.*);实现了我想要的功能,但是如何在PEG.js中实现同样的功

我试图抓住一些在结尾处带有分号的意合之间的文本

示例:
(在这里可以是'anything'!“#·);;任何字符都可以);

我试过这个:

Text
 = "(" text:(.*) ");" { return text.join(""); }
但似乎(*)将包括最后一个;之前);“是否和我得到错误:

预期的“);“或找到输入结尾以外的任何字符

问题是文本可能包含“);“因此,我希望最外层的部分在线条结束时进行描述

这个regex
\(.*);
实现了我想要的功能,但是如何在PEG.js中实现同样的功能呢?我不想在结果中包含外圆括号和分号


如果你知道你在做什么,这看起来应该很容易。所以,关键是一个PEG是确定性的,而一个正则表达式不是。所以一个PEG一旦接受了一些输入就不会回溯。然后我们可以模拟你想要的语义。因为你说的是正则表达式
\(.*))
如果您想做什么,我们可以将其转换为PEG

这个正则表达式的作用是什么?它消耗到输入末尾的所有字符,然后继续回溯,直到它看到一个
);
,也就是说,它消耗最后一个可能的
);

为了使这一点在一个PEG中起作用,我们可以使用一个前瞻来保持消费,如果我们有一个
);

因此,解决方案是:

Text
 = "(" text:TextUntilTerminator ");" { return text.join(""); }

TextUntilTerminator
 = x:(&HaveTerminatorAhead .)* { return x.map(y => y[1]) }

HaveTerminatorAhead
 = . (!");" .)* ");"
textunilterminator
非终端消耗,而
HaveTerminatorAhead
匹配而不消耗它(一个向前看的
&
符号)。然后它消耗一个字符。它这样做,直到它知道我们到达了输入的最后一个
);

HaveTerminalAhead
非终端很简单:它验证前面是否有一个字符,如果有,则保证后面至少有一个
);
。我们还使用负前瞻
在第一个
)处停止;
我们看到(避免使用它,这会重现您原来的问题)


然后,这个PEG复制了您建议的正则表达式的行为。

我有。找不到我要找的东西。或者可能我不明白。如果您知道文档中指定了它,如果您能告诉我它在哪里,我们将不胜感激。很好,它工作了!我也学到了一些东西=)非常感谢!请注意,如果您在更大的语法,您可能应该添加另一种前瞻性来限制检查。上面的代码假设您想要输入上最后一个
,如果您想要匹配
文本以外的内容,这可能不是您想要的行为。我将读取具有多行此类内容的文件,但可能我可以只在t中添加一个\n他需要考虑到这一点吗?我很难理解HaveTerminatorAhead是如何工作的。你能试着用其他方式解释一下吗?