Matlab - 使用正则表达式提取列名

时间:2013-12-21 18:06:36

标签: regex matlab

我想使用regexp从字符串中提取列名 注意:下面显示的字符串只是我正在搜索的实际字符串的一小部分。

'"column_names":["Date","Open","High","Low","Last","Close","Total Trade Quantity","Turnover (Lacs)"]'

我已经完成了regexp的一些基本操作,比如搜索日期(等等),但这个操作对我来说仍然太复杂了。这就是我到目前为止所做的:

regexp(string,'(?<="column_names":[")   

任何帮助将不胜感激......

3 个答案:

答案 0 :(得分:2)

如果你有足够新的Matlab版本,你可以使用更简单,更快捷的strsplit

strsplit(string(18:end-1),'","')

返回

ans = 

  Columns 1 through 6

    'Date'    'Open'    'High'    'Low'    'Last'    'Close'

  Columns 7 through 8

    'Total Trade Quantity'    'Turnover (Lacs)"'

如果您没有strsplit,则下一个最简单(也是快速)的选项是textscan

out = textscan(string(18:end-1),'%s','Delimiter','","','MultipleDelimsAsOne',true)
out{:}'

如果数组的开头并不总是以strfind(string,'":["')开头,您还可以使用类似'"column_names"'的内容来获取数组开头的索引。

编辑:为了完整性,这里是一个应该对整个字符串起作用的正则表达式(它假定你的列名可以包含单词字符(字母,数字,下划线),空格和圆括号) :

out = regexp(string,'(?!^")"([\w\s\(\)]+)"','tokens');
[out{:}]

或者如果修剪字符串,你可以使用它:

out = regexp(string(18:end-1),'[\w\s\(\)]+','match')

答案 1 :(得分:1)

您可以使用strtok

str = '"column_names":["Date","Open","High","Low","Last","Close","Total Trade Quantity","Turnover (Lacs)"]'

names = {};
remain = str;
while ~isempty(remain)
    [name remain] = strtok(remain,'"[],:');
    if ~isempty(name)
        names{end+1} = name;
    end
end

结果:

>> names

names = 

    'column_names'    'Date'    'Open'    'High'    'Low'    'Last'    'Close'    [1x20 char]    'Turnover (Lacs)'

答案 2 :(得分:1)

可以用2个正则表达式完成 (我只是猜测Matlab数组的索引) -

 namesStrs = regexp( str, '(?<="column_names":\[)[^\]]+(?=\])', 'match' )
 for k = 1:length(nameStrs)
    disp(nameStrs(k))
    colsStrs  = regexp( namesStrs(k), '(?<=").*?(?=")', 'match' )
    for n = 1:length(colStrs)
       disp(colStrs(n))
    end
 end