【问题标题】:How to detect an invalid C escaped string using a regular expression?如何使用正则表达式检测无效的 C 转义字符串?
【发布时间】:2009-12-09 12:41:16
【问题描述】:

我想找到一个正则表达式 (regex),它可以检测 C 双引号转义字符串中是否有一些无效转义(您可以在其中找到仅转义的双引号)。

我认为有效的\\ \n \r \" (测试字符串使用“)

对此的部分解决方案是使用(?<!\\)\\[^\"\\nr],但这个无法检测到像\\\ 这样的错误转义。

这是我用来测试匹配的测试字符串:

...\n...\\b...\"...\\\\...\\\E...\...\\\...\\\\\..."...\E...

表达式应匹配最后 6 个无效块,前 4 个有效。问题是我当前的版本确实只发现了 2/5 错误。

【问题讨论】:

  • \\\E 无效——第一个斜杠转义第二个,第三个正试图转义 E…
  • 所以你想测试一个双引号字符串是否包含无效的转义序列?
  • 不要忘记 C 编译器实际上允许:\t\b\v\f\a\?\' 用于简单字符;它们还允许 \o\oo\ooo 用于八进制转义,\xX\xXX 用于十六进制(实际上,名义上多于两个十六进制数字)。 C99 也允许 \uXXXX\U00XXXXXX 用于十六进制编码的 Unicode 字符。

标签: python c regex escaping


【解决方案1】:
(?:^|[^\\])(?:\\\\)*((?:\"|\\(?:[^\"\\nr]|$)))

这是字符串的开头,或者不是反斜杠的开头。然后是一些(可能为零)正确转义的反斜杠,然后是未转义的" 或另一个反斜杠;如果是另一个反斜杠,则后面必须不是"\nr,也不是字符串的结尾。

也会为您捕获不正确的转义。

【讨论】:

  • 谢谢,Python 字符串应该是 r"(?:^|[^\\])(?:\\\\)*((?:\"|\\(?:[^\"\\nr]|$)))"(在第一个双引号前多了一个 \)
  • 我的编辑器不需要我转义双引号;显然,当我逃离他们所有人时,我错过了那个。哦。已更正。
【解决方案2】:

试试这个正则表达式:

^(?:[^\\]+|\\[\\rn"])*(\\(?:[^\\rn"]|$))

如果你有一个匹配,你有一个无效的转义序列。

【讨论】:

  • 这与"不匹配,这是索林所说的无效的想法之一。
猜你喜欢
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多