【问题标题】:matching regex in awk/gawk [duplicate]匹配 awk/gawk 中的正则表达式 [重复]
【发布时间】:2020-02-17 15:18:45
【问题描述】:

请有人让下面的awk 行在 awk 中工作。语法使用标准的 PCRE 正则表达式标准(我需要期望在第一个数字之前有一些非数字字符,即字符串可能看起来像 "++3.59 ± 0.04* ")。 (请注意,我尝试了[0-9][:digit:] 而不是\d)还请注意我确实阅读了https://www.gnu.org/software/gawk/manual/gawk.html#Regexp

gawk 'BEGIN{test="3.59 ± 0.04";match(test, /^.*?(\d+?\.\d+?)\s*?±\s*?(\d+?\.\d+?)$/, arr);print arr[1];}'

【问题讨论】:

  • POSIX 正则表达式引擎不支持惰性量词。继续尝试使用[0-9] 匹配数字,不支持\d。另外,请使用[ \t][[:space:]] 而不是\s
  • PCRE 根本不是标准的。最好的办法是改用 Perl。
  • @WiktorStribiżew 在 POSIX 标准中,* 是贪婪还是懒惰?
  • 它总是贪婪的。

标签: regex awk regex-greedy


【解决方案1】:

您添加到许多?,我认为您需要使用[0-9] 此外,当您以 ^[^0-9] 开头时,只有非数字字符会被“吃掉”。 所以总而言之,我认为你想要:

gawk 'BEGIN{test="3.59 ± 0.04";match(test, /^[^0-9.]*([0-9]+\.[0-9]+)\s*±\s*([0-9]+\.[0-9]+)$/, arr);print arr[1];}

匹配任何非数字字符直到第一个数字,然后将第一个数字捕获为组 1。

感谢@Ed Morton 的更正。我确实错过了原始正则表达式中第一个数字之后的+

【讨论】:

  • PCRE中*?+???的含义是从贪婪匹配到吝啬匹配。这不能用像 Awk 这样的传统的总是贪婪的正则表达式轻松地重新实现,尽管目前尚不清楚 OP 认为这个构造在这里是如何有用的。
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2012-10-31
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多