题目

编写程序,使用 <code>regexp</code> 正则表达式引擎从包含杂乱设备日志的文本中精准提取出所有的测量数值(支持整数与浮点数)。

输入格式:无需外部输入。

输出格式:输出从文本中匹配提取出的所有数值字段列表。

数据范围与约定:正则表达式匹配。

思路与算法

1. regexp 函数语法
regexp(str, pattern, "tokens") 按捕获组返回元胞;再用 [extracted{:}] 展平。

2. 浮点数正则模式
用 =([-+]?\d+\.?\d*) 只取等号后的整数/小数,避免把 Sensor_A1 中的 1 误匹配。

3. 解析转数值
匹配到的元胞数组使用 str2double(matches) 即可一次性向量化转为标准数值数组。

完整程序

% Octave / MATLAB 第80题:regexp 正则表达式提取数值
log_text = "Sensor_A1: temp=23.5 C, pres=101.3 kPa, status=1, err_count=0";

% 匹配等号后的整数或小数,避免吃掉 Sensor_A1 中的 1
extracted = regexp(log_text, '=([-+]?\d+\.?\d*)', "tokens");
extracted = [extracted{:}];

% 向量化转为数值
num_vals = str2double(extracted);

fprintf("日志原始文本:\n  %s\n", log_text);
fprintf("\n正则提取到的数值字符串元胞 (%d 个):\n", length(extracted));
for k = 1:length(extracted)
    fprintf("  提取项 %d: %s\n", k, extracted{k});
end
fprintf("\n转换为数值数组: %s\n", mat2str(num_vals));

运行示例

输出:

日志原始文本:
  Sensor_A1: temp=23.5 C, pres=101.3 kPa, status=1, err_count=0

正则提取到的数值字符串元胞 (4 个):
  提取项 1: 23.5
  提取项 2: 101.3
  提取项 3: 1
  提取项 4: 0

转换为数值数组: [23.5 101.3 1 0]