regexp规则返回文本数据库的列条目

时间:2012-08-24 15:36:05

标签: regex matlab

给定一个简单的分隔符分隔文本数据库,我想构建一个regexp规则,它返回列/字段条目。

给出以下两个示例行

entry1 = '|123|some|string   |101112  |'
entry2 = '|123|some|  |101112  |'

我想获得以下输出:

values1 = '123', 'some', 'string', '101112'
values2 = '123', 'some', '', '101112'

到目前为止,我正在使用以下regexpregexprep组合:

values = regexp(regexprep(entry '[\s]', ''), '\|', 'split')

遗憾地返回以下内容:

values1 =  ''    '123'    'some'    'string'    '101112'    ''
values2 =  ''    '123'    'some'    ''    '101112'    ''

但我希望得到(''之前没有额外123''之后没有额外'101112'

values1 = '123', 'some', 'string', '101112'
values2 = '123', 'some', '', '101112'

根据我的正则表达式规则,为什么我在开始和结束时得到''?如何更改正则表达式规则,仅返回字段值?

2 个答案:

答案 0 :(得分:1)

我不确定这正是您所要求的,但您可以使用strread

strread(entry1(2:end),'%d','delimiter','|')
ans =
         123
         456
         789
      101112

答案 1 :(得分:0)

空字符串就在那里,因为你告诉matlab以|字符分割。分裂意味着你在那里切割。如果|之前没有任何内容,您将获得空字符串。例如,拆分它(regexprep之后的子结果):

'|123|456|789|101112|'

导致(想象在|处剪切字符串):

'', '123', '456', '789', '101112', ''

因此,要么在第一个和最后一个|之间拆分字符串:

nospaces = regexprep(entry, '\s', '')
betweenpipes = nospaces(2:size(nospaces,2)-1)
values = regexp(betweenpipes, '\|', 'split')

..或者根本不使用拆分,只搜索所需的模式:

regexp(entry, '(?=\)(?:\s*)(\d+)(?:\s*)(?=\)', 'match')

Regexp解释道:

  1. 寻找|,但不记得了:(?=\|)
  2. 跳过可能的空格,但不记得它:(?:\s*)
  3. 匹配一个号码:(\d+)
  4. 跳过可能的空格,但不记得它:(?:\s*)
  5. 寻找|,但不记得了:(?=\|)
  6. 我在内存中写这个,因为我没有matlab,所以可能有一些错误..