我有一条规则,
charGroup
: '[' .+ ']';
但我猜这会匹配像[abc\]
这样的东西。假设我希望它只匹配未转义的]
,我该怎么做?在正则表达式中,我会使用负面的后视。
编辑:如果可能的话,我也希望它不合适/懒惰。以便仅匹配[a]
中的[a][b]
。
答案 0 :(得分:2)
你可能想做类似的事情:
charGroup
: '[' ('\\' . | ~('\\' | ']'))+ ']'
;
其中~('\\' | ']')
匹配\
和]
以外的单个字符。请注意,您只能否定单个字符!没有~('ab')
之类的东西。经常犯的另一个错误是否定内部解析器规则不会否定一个字符,而是一个令牌。一个例子可能是顺序:
foo : ~(A | D);
A : 'a';
B : 'b';
C : 'c';
D : ~A;
现在,解析器规则foo
匹配令牌B
或令牌C
(因此只有字符'b'
和'c'
),而词法分析器{{1} }匹配D
以外的任何字符。
答案 1 :(得分:1)
我会使用负面的后视
这不是那么复杂吗?怎么样:
charGroup
: '[' ('\\]' | .)+ ']';