仅允许正则表达式中的特定转义字符

allow only specific escape characters in regular expression

我一直在查看其他 regex 问题,但未能找到答案。我正在研究 ANTLR4 中的语法,并且有一个正则表达式一直在躲避我。

我正在尝试匹配任何字符,except for \ 然后是除 [btnrf"\].

以外的任何字符

我试过 ( ~([\][.]) | [\][btnrf"\] ) 但据我所知 ~ 只否定了一个字符。我收到错误:

error AC0050: extraneous input '[.]' expecting RPAREN while looking for lexer rule element

排除 \* 似乎不难,但允许一小部分可接受的转义字符。我一直在 http://www.regex101.com 并且匹配允许的字符没有任何问题,但出于某种原因我无法弄清楚如何禁止除上述字符之外的转义字符,同时还允许所有其他字符.

手动指定每个有效的输入字符似乎有点矫枉过正,但这可能就是问题所在。类似于:

[a-ZA-Z0-9_!@#$%^&*()\-+=/.,<>;':\b\t\n\r\f\"\]*

这可能不是 100% 有效,但这个想法只是列出所有可能的有效字符,默认情况下会排除任何无效的转义字符。似乎应该有一个更简单的方法。任何有用信息的提示或链接将不胜感激。

到目前为止我的实际规则,它允许用双引号括起来的任何内容作为有效字符串:

STRING : '"' (~[\"] | '\"')* '"';

我手边没有 ANTLR,但以下内容似乎可以满足您的需求:

\([^\].\)\|\(\[btnrf\"\\]\)

如此有效地允许 "EITHER anything other than a backslash followed by any character, OR a backslash followed by a specified character".

例如,将该字符串放入文件正则表达式文件中,并给出包含

的数据文件
\a
\b
\
xy

然后执行 grep -f regexfile datafile 将排除 \a,并且 return :

\b
\
xy