我看到了这个问题:我如何创建一个正则表达式,允许所有字符,除了两个选定的字符?
因此我对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
已经包含了u
和g
。所以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
令牌。