You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB中按指定位置查找数字字符串内目标数值的问题

解决MATLAB中试验编码的通配符匹配问题

嗨,我懂你的困扰了——想用带*的通配符匹配试验编码里的倒数第二个数字,结果strfind完全不生效,反而精确匹配能正常运行。这其实是因为MATLAB的strfind不支持通配符*,它会把*当成普通字符去查找,所以你的带*的字符串自然匹配不到任何结果。

下面给你两种实用的解决方案,按需选用:

方法1:正则表达式(灵活适配各种编码长度)

正则是处理这类模式匹配的绝佳工具,我们可以直接构造出“匹配倒数第二个数字为目标值”的规则。假设你要找的目标数字是120,代码示例如下:

target_num = 120;
% 构造正则规则:任意前缀 + 下划线+目标数字+下划线+任意数字结尾
match_pattern = sprintf('.*_%d_\\d+$', target_num);

% 遍历日志进行匹配
for nl = 1:length(logs)
    code_str = logs{nl,4};
    % 用regexp检查是否匹配,'once'表示找到一个匹配就停止
    if ~isempty(regexp(code_str, match_pattern, 'once'))
        fprintf('找到匹配的试验编码:%s\n', code_str);
        % 这里添加你的后续处理逻辑
    end
end

这个正则的逻辑很清晰:.*匹配任意长度的前缀(包括其他下划线分隔的部分),_%d_精准锁定目标数字前后的下划线,\\d+$匹配最后一段数字结尾,完美定位到倒数第二个数字的位置。

方法2:拆分字符串后直接比较(直观易懂,适合固定格式编码)

如果你的试验编码是固定的下划线分隔结构(比如始终是5段),可以直接把字符串拆分成数组,取倒数第二个元素和目标数字比较:

target_num = 120;

for nl = 1:length(logs)
    code_str = logs{nl,4};
    % 按下划线拆分字符串
    code_parts = strsplit(code_str, '_');
    % 确保拆分后有足够的段数,再比较倒数第二个元素
    if length(code_parts) >= 2 && str2double(code_parts{end-1}) == target_num
        fprintf('找到匹配的试验编码:%s\n', code_str);
        % 这里添加你的后续处理逻辑
    end
end

要是你的MATLAB版本比较旧(R2016b之前),没有strsplit的话,可以用regexp(code_str, '_', 'split')来替代拆分操作。

为什么之前的方法失效?

再补充一句:strfind的核心作用是查找精确的子字符串,比如你写strfind(logs{nl,4}, '*_120_*'),它会去查找包含*这个字符的子串,而不是把*当成“任意字符”的通配符,这就是为什么完全找不到匹配的原因。

内容的提问来源于stack exchange,提问作者Mandarc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:27:38