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
已经包含 u
和 g
。所以 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
代币.
我看到了这个问题: 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
已经包含 u
和 g
。所以 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
代币.