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

时间:2017-01-14 05:22:18

标签: regex grammar antlr4

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

我正在尝试匹配\以外的任何字符后跟[btnrf"\]以外的任何字符。

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

  

错误AC0050:无关输入' [。]'在寻找词法分析规则元素

时期待RPAREN

似乎不应该过于难以排除\*,但允许使用可接受的转义字符的小列表。我一直在http://www.regex101.com并且我在匹配允许的字符方面没有任何问题,但由于某种原因,我无法弄清楚除了上面提到的字符之外如何禁止转义字符,同时也允许所有其他角色。

手动指定每个有效的输入字符似乎有点矫枉过正,但这可能是它所涉及的内容。类似的东西:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我没有ANTLR方便,但以下似乎做了你想要的事情:

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

如此有效地允许“除了反斜杠后跟任何字符,或反斜杠后跟一个指定的字符”。

例如,将该字符串放在文件regexfile中,并给出包含

的数据文件
\a
\b
\\
xy

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

\b
\\
xy