2012-01-24 92 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