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



我看到了这个问题:我如何创建一个正则表达式,允许所有字符,除了两个选定的字符?

因此我对antlr4有了一点想法(我几年前就用过antlr了)。

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

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

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

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

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

那将是假的还是?

我想了很多,但是没有成功。


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

现在,例如,如果我想让鹿角识别这个:

我有例如作为输入:

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`

关于:

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

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

如果你想跳过注释,只需:

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

编辑

例如,你有输入:AA,这也应该在C,但它不会工作。

这是正确的,您说您希望C识别"所有不属于A或"的字符"。你要找的可能就是这个:

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

这样,以"ug"结尾的小写字母将成为A令牌,以大写字母开头的字母将成为B令牌,所有其他的将成为C令牌。