ANTLR4 如何创建一个正则表达式,允许除这两个语句之外的所有语句//如何删除输入的一部分

ANTLR4 How can I create a regular expression that allows all except this two statements // How to delete a part of a input

我看到了这个问题: ANTLR4 How can I create a regular expression that allows all characters except two selected ones?

因此,我对 antlr4 有了一些想法(我几年前使用过 antlr)。

现在我有另一个问题,例如我们会有:

A: [a-z]+'ug';
B: [A-Z][a-z]+;
C:

现在我想让 C 识别所有不属于 A 或 B 的字符。

我们怎么做到的?正确的正则表达式应该是什么?

   C: ~[a-zugA-za-z]

那是错误的还是?

想了很多,都没有成功。


还有一个问题,只是为了兴趣。

现在,例如,如果我想让 antlr 为我识别这个:

我有,例如作为输入:

thisisonlyatest/*oidjqiodjqw*/test

现在我想删除/* */之间的所有内容,这样结果就只有:

thisisonlyatesttest

我们怎么做到的?

或者例如输入为:

thisisonlyatest/*oidjqiodjqw*/test
another line /*kjdqio*/ another text

结果:

thisisonlyatest test
another line another text

我相信我们可以做到:

A: ('/*'(.)*'*/')
B: ~A

但是没用。

一个字符集[a-za-z][a-z]完全一样。在已经包含 a-z 的集合中包含 ug[a-zug] 不是必需的,因为范围 a-z 已经包含 ug。所以 C 只是:

C: ~[a-zA-Z]; // note that `A-z` must be `A-Z`

W.r.t.:

A: ('/*'(.)*'*/');
B: ~A; // No, this is incorrect!

正如我在另一个问题中提到的:您不能否定匹配多个字符的规则(在本例中为 A)。您只能否定匹配单个字符的规则。

如果您想跳过评论,只需执行以下操作:

COMMENT
 : '/*' .*? '*/' -> skip
 ;

编辑

For example you have the input: AA this should also be at C but it would not work.

没错,您说您希望 C 识别“所有不属于 A 或 B 的字符”。你要找的可能就是这个:

A: [a-z]+ 'ug';
B: [A-Z][a-z]+;
C: [a-zA-Z]+;

这样,以 "ug" 结尾的小写字母将成为 A 标记,以大写字母开头的字母将成为 B 标记,所有其他字母将成为 C 代币.