我想使用regexp
从字符串中提取列名
注意:下面显示的字符串只是我正在搜索的实际字符串的一小部分。
'"column_names":["Date","Open","High","Low","Last","Close","Total Trade Quantity","Turnover (Lacs)"]'
我已经完成了regexp
的一些基本操作,比如搜索日期(等等),但这个操作对我来说仍然太复杂了。这就是我到目前为止所做的:
regexp(string,'(?<="column_names":[")
任何帮助将不胜感激......
答案 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