2012-01-24 126 views
0

是否有一種很好且乾淨的方式在matlab中的較大字符串中查找大小爲2-4的大寫字母字符串。例如,假設我有一個字符串...在較大的字符串中檢測大寫字母字符串

stringy = 'I imagine I could FLY'; 

有沒有一種很好的方法來提取字符串的FLY部分?目前我使用上()函數來確定所有的字符串是大寫這樣的人物......

for count = 1:length(stringy) 
    if upper(stringy(count))==stringy(count) 
      isupper(count)=1; 
    else 
      isupper(count)=0; 
    end 
end 

然後,我只是經歷的二元矢量和識別時 那裏有2-4個1。

這種方法正在工作......但我想知道是否有一個更清潔的方式 要做到這一點......謝謝!

+0

這可以幫助...
http://stackoverflow.com/questions/4598315/regex-to-match-only-uppercase -words與 - 些 - excepti ons 祝你好運。 – Raathigesh

回答

4

您可以對此使用正則表達式。正則表達式[A-Z]{2,4}將在字符串中搜索2-4個大寫字母。

相應的matlab函數被稱爲regexp

regexp(string,pattern)將所有匹配的地方的子索引返回stringpattern

對於你的模式,我有兩個建議:

  1. \<[A-Z]{2,4}\>。這種搜索全字是由2-4大寫字母(因此它不低於搶TOUCH):

    stringy = 'I imagine I could FLY and TOUCH THE SKY'; 
    regexp(stringy,'\<[A-Z]{2,4}\>') % returns 19, 33, 37 ('FLY','THE','SKY') 
    

    編輯:Matlab的使用\<\> word邊界不是標準\b )。

  2. 如果你有一個字符串,其中情況下,可以在一個字內混合,並要提取這些,嘗試(?<![A-Z])[A-Z]{2,4}(?![A-Z])(這意味着沒有用大寫字母包圍「2-4大寫字母):

    stringy = 'I image I could FLYandTouchTHEsky'; 
    % returns 17 and 28 ('FLY', 'THE') 
    regexp(stringy,'(?<![A-Z])[A-Z]{2,4}(?![A-Z])') 
    
    % note '\<[A-Z]{2,4}\>' wouldn't match anything here since it looks for 
    % *whole words* that consist of 2-4 capital letters only. 
    % 'FLYandTouchTHEsky' doesn't satisfy this. 
    

選擇正則表達式的基礎上要發生什麼樣的行爲。

+0

這看起來像它會完美的工作!謝謝!有一個問題......當我嘗試第一點的方法時,我得到一個空的輸出。爲什麼會這樣? (我的意思是我使用了你在控制檯上做的兩個陳述) – Flaminator

+0

呵呵,原來Matlab使用'\ <' and '\>'代替了'\ b',我會更新我的答案(八度使用更標準的'\ b'...) –

+0

完美,謝謝!因此,這種方法將返回大寫字母部分開頭的索引,但不會表明它是2,3或4個大寫字母的字符串是否正確? – Flaminator