regex - Matlab 中的正则表达式仅保留数组中的指定项

标签 regex matlab

我有一个 channel 列表:

channels = {'1LT1', '1LT2', '1LT3', '1LT4', '1LT5', '2LA1', '2LA2', '2LA3', '3LH1', '3LH5', '4LT1', '4LT2', '4LT3', '5LH1', '5LH2', '4LT10'}

我需要编写一个算法来仅保留远端 channel 。这意味着对于每种类型的 channel (“1LT”、“2LA”、“3LH”、“4LT”等),我只需要最后编号最高的 channel 。最好的方法是返回这些 channel 的索引。例如,对于上述列表,结果应为:

[5, 8, 10, 15, 16]

我想我可以通过像这样的分割来使用正则表达式来做到这一点:

row_i = 1;
for ch_i=[1:length(channels)]
    try
        [n(row_i,:), ch_type(row_i,:)] = strsplit(channels{ch_i},'\d+[A-Z]', 'DelimiterType','RegularExpression');
        row_i = row_i + 1;
    catch
        continue
    end
end

但后来我真的陷入困境了。有人可以给我一些创建好的算法的技巧吗?

我很感谢您的任何想法!

最佳答案

您可以使用regexp要将每个字符串分解为 channel 和数字,请使用 findgroups 为 channel 创建数字标签,将数字字符串转换为实际数字 str2double ,然后 splitapply找到每组的最大值。这是代码,尽管我现在无法测试它,因此可能需要一些调整:

tokens = regexp(channels, '(\d+[A-Z]+)(\d+)', 'tokens');
tokens = vertcat(tokens{:});
[grps, channelID] = findgroups(tokens(:, 1));
nums = str2double(tokens(:, 2));
channelMax = splitapply(@max, nums, grps);

使用 channelIDchannelMax 值,您可以重建远端 channel 名称并使用 sprintf 在 channel 列表中查找它们的索引。 , strsplit ,和 ismember :

distal = strsplit(sprintf('%s%d\n', channelID, channelMax));
index = find(ismember(channels, distal));

关于regex - Matlab 中的正则表达式仅保留数组中的指定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182506/

相关文章:

jquery - 家庭电话号码正则表达式

javascript - 如何使用正则表达式选择字符串中每个单词的首字母

javascript - 如果匹配则获取第一个值

python - "Undefined variable "py "or class"尝试从 MATLAB R2014b 加载 Python 时?

matlab - 如何在 Matlab 句柄类中创建 "one-way dependency"

python - REGEX - 匹配列表项后跟另一个列表项 'n' 次

java - 正则表达式匹配 "test"而不是 "test-1"

matlab - 删除相邻的重复项

matlab - CPU 和 GPU 中的 SVD 速度

matlab - MATLAB 中的局部二进制模式