0

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

给出以下两个示例行

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'

鉴于我的正则表达式规则,为什么我''在开头和结尾都得到了?如何更改我的正则表达式规则,只返回字段值?

4

2 回答 2

1

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

strread(entry1(2:end),'%d','delimiter','|')
ans =
         123
         456
         789
      101112
于 2012-08-24T15:51:13.360 回答
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')

正则表达式解释:

  1. 寻找|,但不记得了:(?=\|)
  2. 跳过可能的空格但不记得了:(?:\s*)
  3. 匹配一个数字:(\d+)
  4. 跳过可能的空格但不记得了:(?:\s*)
  5. 寻找|,但不记得了:(?=\|)

我是凭记忆写的,因为我这里没有matlab,所以可能会有一些错误..

于 2012-08-24T16:24:31.627 回答