使用regexp匹配两个子字符串之间的返回子字符串

时间:2017-09-08 13:43:46

标签: regex matlab

我有一个字符向量记录列表。这是一个例子:

'1mil_0,1_1_1_lb200_ks_drivers_sorted.csv'
'1mil_0_1_lb100_ks_drivers_sorted.csv'
'1mil_1_1_lb2_100_100_ks_drivers_sorted.csv'
'1mil_1_1_lb100_ks_drivers_sorted.csv'

从这些名称中,我想提取两个子串1mil__ks_drivers_sorted.csv之间的任何内容。

所以在这种情况下,输出将是:

0,1_1_1_lb200
0_1_lb100
1_1_lb2_100_100
1_1_lb100

我使用的是MATLAB,所以我想用regexp来做这件事,但我无法理解什么样的正则表达式是正确的。

或者是否有其他方法可以在不使用regexp的情况下执行此操作?

2 个答案:

答案 0 :(得分:4)

让数据为:

x = {'1mil_0,1_1_1_lb200_ks_drivers_sorted.csv'
     '1mil_0_1_lb100_ks_drivers_sorted.csv'
     '1mil_1_1_lb2_100_100_ks_drivers_sorted.csv'
     '1mil_1_1_lb100_ks_drivers_sorted.csv'};

您可以使用lookbehind and lookahead查找两个限制子字符串,并匹配其间的所有内容:

result = cellfun(@(c) regexp(c, '(?<=1mil_).*(?=_ks_drivers_sorted\.csv)', 'match'), x);

或者,由于正则表达式只生成一个匹配项,因此可以使用以下更简单的替代方法(感谢@excaza注意):

result = regexp(x, '(?<=1mil_).*(?=_ks_drivers_sorted\.csv)', 'match', 'once');

在您的示例中,上述任一项都给出了

result =
  4×1 cell array
    '0,1_1_1_lb200'
    '0_1_lb100'
    '1_1_lb2_100_100'
    '1_1_lb100'

答案 1 :(得分:0)

对我来说,简单的方法就是使用espace或者什么都不用来替换你不需要的字符串,剩下的就是你需要的。

如果是列表,您可以使用循环来执行此操作。

例如替换&#34; 1mil _&#34;用&#34;&#34;和&#34; _ks_drivers_sorted.csv&#34;用&#34;&#34;

newChr = strrep(chr,'1mil_','')
newChr = strrep(chr,'_ks_drivers_sorted.csv','')