【问题标题】:match a floating point number that is not inside parenthesis匹配不在括号内的浮点数
【发布时间】:2019-12-05 18:02:03
【问题描述】:

我正在尝试用 grep 匹配一堆文件中的模式。这些文件包含 G 代码(CNC 机器代码)。每个数字都应该有一个与之关联的字母(例如:X4.5、G71、Z-0.75)。许多文件有拼写错误并且缺少字母。我正在尝试使用 grep 通过匹配文件中没有紧跟在字母前面的任何十进制数字来识别这些文件。但是,如果模式出现在括号内,我不想匹配相同的模式。括号中的任何内容都是注释,不应与正则表达式匹配。

测试文本:

%
O01934 (AWC C011469)
(MATL: 4.0 X 2.0 X A020)
N90 G00 4.2 z0.1
Z0.1125 F0.004 
N150 X2.2 .01 (inline comment)
0.03

从技术上讲,第 3 行包含我正在寻找的模式,但我不想匹配它,因为它在括号内。

第 4、6、7 行是我尝试匹配的模式示例。数字前面没有字母,也没有括号内。

我已经在 regextester.com 上呆了一个多小时,现在我头疼。也许对正则表达式更有经验的人可以提供帮助。

我能想到的最好的模式是([[:space:]]|^)-?[[:digit:]]*\.[[:digit:]]+([[:space:]]|$)。哪个匹配我想要的 4、6 和 7。但也匹配第 3 行注释中的数字。我不知道如何匹配一个而不匹配另一个。

【问题讨论】:

  • 听起来你想要pcregrep -o '\([^()]*\)(*SKIP)(*F)|(?<!\S)-?\d*\.\d+(?!\S)' file。尽管您说“前面没有字母的数字”,但您尝试的正则表达式仅匹配空格之间的数字。请准确。
  • 你能突出显示应该匹配的是什么,很难说吗?没关系,我会学CNC软件,过几年试试回答。
  • 谢谢。不精确并不是我的本意。我的正则表达式是我能想到的最好的。我什至不明白你的正则表达式,但它有效。谢谢!
  • @x15 我无法突出显示代码块中的文本。 “第 4、6、7 行:数字前面没有紧跟字母,也没有放在括号内。”如果您无法通过该描述说出我的意思,那么您可能无论如何都无法帮助我解决这个问题。

标签: regex grep pcregrep


【解决方案1】:

您的正则表达式可以修复并用作

pcregrep -o '\([^()]*\)(*SKIP)(*F)|(?<!\S)-?\d*\.\d+(?!\S)' file

\([^()]*\)(*SKIP)(*F) 部分匹配最近括号内的任何子字符串并忽略此匹配,从而忽略括号内任何可能的匹配。

如果您只需要在字母后避免匹配,请将 (?&lt;!\S) 替换为 (?&lt;!\p{L})

【讨论】:

  • 非常感谢您的澄清。我最终使用 grep -P 而不是 pcregrep -o 与模式,这样我就可以避免必须安装 pcregrep 来运行脚本。双向工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多