【问题标题】:How does golang do with complicated regexp patterngolang如何处理复杂的正则表达式模式
【发布时间】:2016-02-13 09:13:11
【问题描述】:

我想替换 golang 中 shell 输出的所有 ANSI/VT100/xterm 控制序列我搜索了这个正则表达式模式here,但它不起作用! 这是错误:

panic: regexp: Compile(`[\b]`): error parsing regexp: invalid escape sequence: `\b`

code sample

让我说得更清楚。我想在golang中完成以下代码:

  #!/usr/bin/env perl
  while (<>) {
      s/ \e[ #%()*+\-.\/]. |
         (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
         (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
         (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
         \e.|[\x80-\x9f] //xg;
         1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
      print;
  }

【问题讨论】:

  • 请将(部分)代码放入问题中。
  • @Stefan 代码示例是 golang 操场的链接

标签: regex go re2


【解决方案1】:

请改用[^\x08]\x08


[\b]\e 不包括在 regexp syntax 中所述的受支持的转义序列中。

Backspace:对于其他正则表达式风格,转义序列 \b 在字符类中具有不同的含义:它匹配退格字符(十六进制 08)。但是,您可以将其转义为 \x08

Esc:同样,对于 Escape \e(十六进制 1B),使用 \x1b

另外,如果你想匹配任何控制字符,你可以使用[[:cntrl:]],它匹配[\x00-\x1F\x7F]

【讨论】:

  • 你的回答很好。但我也无法在 golang 中完成脚本。你能看看我的代码吗:play.golang.org/p/SEqJuN2z7l
  • @nullneco 1。原始的正则表达式使用模式标志/x 以提高使用cmets 的可读性,即not supported by golang。因此,您需要从正则表达式中删除所有空格和换行符。 2 您正在使用 ^ 字符设置 var str。这就是控制台打印 Escapes \e 的方式,但没有实际字符(十六进制 1B)......你有真实的文本还是只是控制台的副本?
  • @nullneco 例如,如果您将 \x1b 更改为 \^,您将匹配一些匹配项 (playground)。但是,str 中没有真正的控制字符,正则表达式无法实际工作。
  • 我只是从文件中复制这些文本,我记录了几个命令的结果脚本。也许我不知道不同类型的呈现角色,即从 vim 或控制台。这些文本是如何被解释的?令人困惑..
  • @nullneco 控制字符无法打印(显然)。如果您正在处理直接输出,那么使用该正则表达式就可以了。但是,如果您打算解析从控制台复制的文本,那么您应该以某种方式对其进行调整以解析控制台打印的字符。
猜你喜欢
  • 1970-01-01
  • 2017-04-19
  • 2020-07-06
  • 2015-02-21
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多