1

我已经用头撞了2天,但仍然无法破解它。

我有包含数百行 XY 位置数据的 Gcode 文件,我正在尝试计算正则表达式以仅提取“X”和“Y”字符之后的浮点值。

Gcode 的每一行通常都喜欢这样,并且使用起来相当简单

G1X445.71Y602.47

但偶尔我也会有这样的奇怪线条,这让它变得更加棘手

G1X446.11     // no Y value
G1Y601.91     // no X value
G1X445.73Y602.26S76.5F300    // Y value is followed by S or F values

我正在尝试制定正则表达式以在任何这些情况下仅提取 X 和 Y 值。这些值始终为正浮点数。如此神奇的正则表达式代码是这样的

var lineData = "G1X445.71Y602.47";
var X = lineData.match(/regex_to_find_X_float/)
var Y = lineData.match(/regex_to_find_Y_float/)

//resulting in: X= 445.71 Y= 602.47 

以及偶尔不一致的线条

  • G1X446.11 --> X= 446.11 Y=null (为缺失的 Y 值添加一个空值)
  • G1Y601.91 --> X= null Y= 601.91(为缺失的 X 值添加一个 null
  • G1X445.73Y602.26S76.5F300 --> X= 445.73 Y=602.26(忽略 F 和 S 值)

我最接近的是, X(?:\d+\.\d+|\d+)但它仍然保持 X 为“X445.71”

任何建议都非常感谢...

4

2 回答 2

0

我找到了与您的工作相关的文章。检查跟随网址

https://regexr.com/4222s

我建议您在找到“X445.71”后尝试使用 slice() 函数删除“X”。

var X = lineData.match(/regex_to_find_X_float/).slice(1)
于 2021-06-28T15:07:36.247 回答
0

如果值始终为正浮点值,则可以使用 3 个捕获组的交替,其中 Y 值在第 2 组或第 3 组中。

X(\d+\.\d+)(?:Y(\d+\.\d+))?|Y(\d+\.\d+)
  • X(\d+\.\d+)匹配 X 并捕获第1 组中的数字部分
  • (?:Y(\d+\.\d+))?可选择匹配 Y 并捕获第2 组中的数字部分
  • |或者
  • Y(\d+\.\d+)匹配和第3 组Y中的数字部分

正则表达式演示

然后您可以检查捕获组值。

const regex = /X(\d+\.\d+)(?:Y(\d+\.\d+))?|Y(\d+\.\d+)/;
[
  "G1X445.71Y602.47",
  "G1X446.11",
  "G1Y601.91",
  "G1X445.73Y602.26S76.5F300"
].forEach(s => {
  const m = s.match(regex);
  if (m) {
    if (m[1]) console.log(`X: ${m[1]}`);
    if (m[2]) console.log(`Y: ${m[2]}`);
    if (m[3]) console.log(`Y: ${m[3]}`);
    console.log("---------------------------");
  }
});

于 2021-06-28T21:09:08.627 回答