【问题标题】:allow only specific escape characters in regular expression在正则表达式中只允许特定的转义字符
【发布时间】:2017-01-14 16:39:31
【问题描述】:

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

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

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

错误 AC0050:在查找词法分析器规则元素时需要 RPAREN 的无关输入“[.]”

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

手动指定每个有效的输入字符似乎有点矫枉过正,但归根结底可能就是这样。比如:

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

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

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

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

【问题讨论】:

  • 我不明白的是,您要否定哪些字符?
  • 我试图允许所有常规字符并禁止所有转义字符,除了提到的字符。所以\t\" 有效,但\u 无效。

标签: regex grammar antlr4


【解决方案1】:

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

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

如此有效地允许“除了反斜杠后跟任何字符或反斜杠后跟指定字符之外的任何其他内容”。

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

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

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

\b
\\
xy

【讨论】:

  • 啊,这正是我要找的……我只需要稍微修改一下 ANTLR 语法,就可以了,谢谢!
  • 我遇到的一个小问题,双引号是不合法的,除非前面有反斜杠。我尝试添加[^"] 代替.,但它似乎无法正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多