匹配不在括号内的浮点数

match a floating point number that is not inside parenthesis

我正在尝试使用 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

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

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