声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 8100|回复: 6

[编程技巧] 如何提取一个字符串中间的数字部分?

[复制链接]
发表于 2009-1-17 13:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
比如一系列字符串:'H100L200'、'H200L300',我想把H之后和L之后的数字提取出来分别存储成两个数值变量,该如何操作?
回复
分享到:

使用道具 举报

发表于 2009-1-17 14:35 | 显示全部楼层
发表于 2009-1-17 15:15 | 显示全部楼层
help regexp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clear
clc
str1='H100L200';
a1=regexp(str1,'[0-9]');
% num1=str1(a1); 提取离散数字
aa1=diff(a1);
num1=[];
num=zeros(1,length(a1));
j=1;
for i=1:length(aa1)
    if aa1(i)==1
        num1=[num1,str1(a1(i))];
    else
        num1=[num1,str1(a1(i))];
        num(j)=str2num(num1);
        j=j+1;
        num1=[];
    end
    if (i==length(aa1)) && (aa1(end)==1)
       num1=[num1,str1(a1(length(aa1)+1))];
       num(j)=str2num(num1);
    end
end
clear num1
disp(num)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
100   200     0     0     0     0

评分

1

查看全部评分

 楼主| 发表于 2009-1-17 16:12 | 显示全部楼层
原帖由 friendchj 于 2009-1-17 15:15 发表
help regexp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clear
clc
str1='H100L200';
a1=regexp(str1,'[0-9]');
% num1=str1(a1); 提取离散数字
aa1=diff(a1);
num1=[];
num=zeros(1,length(a1));
j=1;
...


感谢friend兄的热心肠,你的方法是可行的。不过我又找到了处理字符和数字同行的更简便的方法,全靠大家都启发。

clear;
clc;

filename='H100L200.txt';
[temp,name,ext] = fileparts(filename);

locl=findstr(name,'L');  %字符L在字符串中的位置
longh=locl-2;  %H数据长度
longl=length(name)-locl;  %L数据长度
strh=name(2:locl-1);  %取出H的字符
strl=name(locl+1:length(name));  %取出L的字符
hh=str2num(strh);
ll=str2num(strl);

评分

1

查看全部评分

发表于 2009-1-17 16:44 | 显示全部楼层

回复 楼主 vincentsuen 的帖子

3楼的比较一般化! 试试下面, 可能较易懂!
str1='H100L200';
hh=findstr(str1,'H'); ll=findstr(str1,'L');
No1=str2num(str1(hh+1:ll-1)); No2=str2num(str1(ll+1:end));
[No1,No2]

非常抱歉!! 个人习惯进入论坛即查新帖, 连开好几十帖再一一看!
时常就解决了还不知! 帮看看是否需删!


[ 本帖最后由 ChaChing 于 2009-1-17 16:51 编辑 ]
 楼主| 发表于 2009-1-18 15:20 | 显示全部楼层
原帖由 ChaChing 于 2009-1-17 16:44 发表
3楼的比较一般化! 试试下面, 可能较易懂!
str1='H100L200';
hh=findstr(str1,'H'); ll=findstr(str1,'L');
No1=str2num(str1(hh+1:ll-1)); No2=str2num(str1(ll+1:end));
[No1,No2]

非常抱歉!! 个人习惯进入论 ...


代码更精简!赞一个!
发表于 2009-1-18 21:22 | 显示全部楼层

  1. clear;clc
  2. str1='A3B56C58$@41NF';           %str2='H100L200';
  3. R=regexp(str1,'\d{1,}','match');
  4. for i=1:length(R)
  5.     eval(sprintf('No(%d)=str2num(R{%d});',i,i));
  6. end
  7. No
复制代码


No =
     3    56    58    41

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 00:22 , Processed in 0.074909 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表