【问题标题】:Detecting Capital Letter Strings in a Larger String检测较大字符串中的大写字母字符串
【发布时间】:2012-02-17 09:40:29
【问题描述】:

在 matlab 的较大字符串中,有没有一种很好且干净的方法来查找长度为 2-4 的大写字母字符串。例如,假设我有一个字符串...

 stringy = 'I imagine I could FLY';

有没有一种很好的方法来提取字符串的 FLY 部分?目前我正在使用 upper() 函数来识别字符串中所有像这样大写的字符...

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

然后,我只是通过二进制向量并确定何时 一排有2-4个1。

此方法有效...但我想知道是否有更清洁的方法 要这样做...谢谢!

【问题讨论】:

标签: matlab


【解决方案1】:

您可以为此使用正则表达式。正则表达式[A-Z]{2,4} 将在字符串中搜索 2-4 个大写字母。

对应的matlab函数调用regexp

regexp(string,pattern) 将子索引返回到与pattern 匹配的所有位置的string

对于您的模式,我有两个建议:

  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 使用\&lt;\&gt; 作为单词边界,而不是标准的\b)。

  2. 如果您有字符串可以在一个单词中混合大小写并且您想提取这些字符串,请尝试(?&lt;![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.
    

根据您希望发生的行为选择正则表达式。

【讨论】:

  • 这看起来可以完美运行!谢谢!一个问题......当我尝试你在第 1 点中的方法时,我得到一个空输出。为什么会这样? (我的意思是我使用了您在控制台中所做的两个语句)
  • 呵呵,原来Matlab使用\&lt;\&gt;作为单词边界而不是\b,我会更新我的答案(八度使用更标准的'\b'... )
  • 完美,谢谢!所以这种方法将返回大写字母部分开头的索引,但不会指示它是 2,3 还是 4 个大写字母的字符串,对吧?
  • 想通了我上面的说明。如果你返回两个参数(即 [a b]=regexp... 从正则表达式中返回,那么第一组将指示大写字母字符串的开始位置,第二组将指示它的结束位置。
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多