2012-08-24 46 views
0

給出一個簡單的分隔符分隔的文本數據庫,我想構造一個regexp規則,它返回列/字段條目。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' 
給我的正則表達式規則

,爲什麼我拿到''開頭和結束?我如何改變我的正則表達式規則,只返回字段值?

回答

1

我不知道它到底是你所要求的東西,但你可以使用strread

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

謝謝!與'regexp'相比,'strread'的表現如何?我必須解析數千行......我已經對我的原始文章進行了編輯,希望能夠解釋我想要的內容。但是,是的,你的解決方案有效除了如果一個字段爲空(參見'entry2'),你的代碼將返回'0'而不是'[]' – memyself

+0

對不起,我不知道性能,你應該嘗試... – Oli

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在這裏,所以可能會有一些錯誤..

+0

不幸的是你的'regexp'規則返回'{}':(我修正了代碼中的錯誤(從'(?= \)'到'(?= \ |)'),但它仍然不起作用。 – memyself

相關問題