DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jsuguo
今日帖子: 34
在线用户: 14
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 cnbcadmin (cnbcadmin) ★☆☆☆☆ -
普通会员
2020/8/25 9:36:37
标题:
DELPHI 截取字符串求助 浏览:1593
加入我的收藏
楼主: 有一个字符串,{AA/BB/CC/DD}AB CD{11}{22}DEFG  0123{111/222/333/444}00000
想将其分割为:AA,BB,CC,DD,AB CD,11,22,DEFG  0123,111,222,333,444,00000
有什么好点的方法呀!??????????
----------------------------------------------
-
作者:
男 dlfsystem (dlfsystem) ★☆☆☆☆ -
盒子活跃会员
2020/8/25 9:44:49
1楼: 分别用{}/做三次分隔.
----------------------------------------------
-
作者:
男 cnbcadmin (cnbcadmin) ★☆☆☆☆ -
普通会员
2020/8/25 10:22:43
2楼: 还有其他的方法吗?给个思路呀,谢谢!!
----------------------------------------------
-
作者:
男 szjackson (szjackson) ★☆☆☆☆ -
普通会员
2020/8/25 10:29:17
3楼: 字符串替换再分隔
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/8/25 10:29:34
3楼: 字符串搜索替换。
/ 替换为,
{} 替换为,

最简单了。
----------------------------------------------
武汉天气不好
作者:
男 supermay (supermay) ★☆☆☆☆ -
盒子活跃会员
2020/8/25 10:35:01
4楼: 用for
if str[i]='/' then
str[i]:=',';
if str[i]='{' then
str[i]:=','
if str[i]='}' then
str[i]:=','
----------------------------------------------
链接:https://pan.baidu.com/s/12jzmECYKhGCsHBxz8tmB6w 提取码:pelr --来自百度网盘超级会员V9的分享
作者:
男 lps (lps) ★☆☆☆☆ -
盒子活跃会员
2020/8/25 10:42:04
5楼: CD{11}{22}DEFG
这里的}{需要特别处理,楼上好多人没有考虑到!
建议楼主还是学一下正则吧
----------------------------------------------
-
作者:
男 tiez (骑牛夜旅) ★☆☆☆☆ -
普通会员
2020/8/25 10:47:22
6楼: 从一个流里按字节读,向另一个流里写,每个读出的判断一下是不是0-9 A-Z a-Z,如果不是就替换成,搞个标志,如前面是重复的,就丢掉
----------------------------------------------
-
作者:
男 cnbcadmin (cnbcadmin) ★☆☆☆☆ -
普通会员
2020/8/25 10:59:21
7楼: 是呀,而且还有其他的字符串里面的}{还很多,不好处理?感谢大家的指导呀!!!!
----------------------------------------------
-
作者:
男 star1010 (star) ★☆☆☆☆ -
普通会员
2020/8/25 11:09:00
8楼: 就用正则表达式应该方便
----------------------------------------------
-
作者:
男 cnbcadmin (cnbcadmin) ★☆☆☆☆ -
普通会员
2020/8/25 11:22:45
9楼: 不太会用,请个好心高手弄段代码学习一下呀!!
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2020/8/25 11:26:13
10楼: function mySplit(const S: string): string;
const
  Separator = ['{', '/', '}'];
var
  len: Integer;
  i: Integer;
  m: Integer;
begin
  Result := S;

  len := Length(S);
  m := 1;
  for i := 1 to len do begin
    if CharInSet(S[i], Separator) then begin
      if not CharInSet(Result[m], Separator) and (i < len) and not CharInSet(S[i +1], Separator) then begin
        Result[m] := ',';
        Inc(m);
      end;
    end else begin
      Result[m] := S[i];
      Inc(m);
    end;
  end;
  if m <= len then begin
    SetLength(Result, m -1);
  end;
end;

ShowMessage(mySplit(Trim('{AA/BB/CC/DD}AB CD{11}{22}DEFG  0123{111/222/333/444}00000}')));
我这个函数不会去除空格,所以先用Trim去除一下首尾的空格比较好,另外,多个分隔符只会生成一个逗号,首尾的分隔符不会逗号。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2020/8/25 14:34:31
11楼: 1. 将所有的'[',']','/'替换成逗号
2. 在字符串一头一尾各加一个逗号
3. 重复, 将所有子字符串',,'替换成单个',', 直到替换完成后长度不变(没有重复逗号了)
4. 截取从第2个字符开始到最后倒数第2个字符(去掉一头一尾两个逗号)
----------------------------------------------
-
作者:
男 gaono1 (晕乎) ▲▲▲▲▲ -
普通会员
2020/8/25 15:10:24
11楼: 可以使用正则来做。
for aMatch in TRegEx.Matches('{AA/BB/CC/DD}AB CD{11}{22}DEFG  0123{111/222/333/444}00000', '\b[\w ]+\b') do 
  Memo1.Lines.Add(aMatch.Value);
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/8/25 18:22:00
12楼: 字符串分析的标准做法是状态机。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2020/8/25 20:17:50
13楼: 难道 第二个3楼的 办法不行吗?
干吗 越来越复杂了呢?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 isxuzhu (e.Wong) ★☆☆☆☆ -
盒子活跃会员
2020/8/25 21:44:44
14楼: 3楼是最简便的方法。
先替换掉{}
再替换单个的{
----------------------------------------------
你我,都可以是个造梦者!欢迎加入脚本引擎PaxCompiler交流群303904495http://www.cnblogs.com/fireboxsoft有需要错别字检测软件的朋友可以在我博客上的地址下载使用,备注“2ccc”的朋友可以免费获取超级黄金VVVVVVVVVVIP授权
作者:
男 cxg417 (cxg417) ★☆☆☆☆ -
盒子活跃会员
2020/8/25 23:54:24
15楼: var
I:Integer;
S:string;
A:TArray<string>;
begin
  Memo1.Lines.Clear;
  S:='{AA/BB/CC/DD}AB CD{11}{22}DEFG  0123{111/222/333/444}00000';
  A:=S.Split(['{','}','/',' '],TStringSplitOptions.ExcludeEmpty);
  for I := Low(A) to High(A) do
    Memo1.Lines.Add(A[I]);
----------------------------------------------
-
作者:
男 cnbcadmin (cnbcadmin) ★☆☆☆☆ -
普通会员
2020/8/26 8:50:35
16楼: 感谢大家的帮助,非常感谢!!!!!!!!!!
----------------------------------------------
-
作者:
男 datm (dATM) ★☆☆☆☆ -
盒子活跃会员
2020/8/26 9:57:01
17楼: 有这么麻烦吗?
此帖子包含附件:
PNG 图像
大小:6.2K
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2020/8/27 9:46:25
18楼: 不知道你用什么版本的Delphi如果是高版本的,内置了字符串的拆分方法
var
  s, item : string;
  ss : TArray<string>;
begin
  s := '{AA/BB/CC/DD}AB CD{11}{22}DEF';
  ss := s.Split(['{','}','/'], TStringSplitOptions.ExcludeEmpty);
  for item in ss do
  begin
    ShowMessage(item);
  end;
end;
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/8/27 19:26:16
19楼: 18楼:新方法,学习了。
----------------------------------------------
-
作者:
男 laimama_1 (苞谷) ★☆☆☆☆ -
盒子活跃会员
2020/8/29 13:31:22
20楼: 武大侠高高!!!
怎么会有两个3楼?
----------------------------------------------
-
作者:
男 wangdonghai (wdh) ★☆☆☆☆ -
盒子活跃会员
2020/8/30 18:41:04
21楼: function OpStr(AStr:string):string;
var
  i,k:Integer;
  s:string;
begin
  s:='';
  k:=0;
  for i := 1 to Length(AStr) do
  begin
    if AStr[i] in ['{','/','}'] then
    begin
      if k=0 then //忽略首部特殊字符
        Continue;

      if s[k]=',' then //特殊字符相连
        Continue;

      s:=s+',';
      Inc(k);
    end
    else begin
      s:=s+AStr[i];
      Inc(k);
    end;
  end;

  if s[Length(s)]=',' then //忽略尾部特殊字符
    Delete(s,Length(s),1);

  Result := s;
end;

procedure TForm5.Button2Click(Sender: TObject);
begin
  //Edit1.Text := '{AA/BB/CC/DD}AB CD{11}{22}DEFG  0123{111/222/333/444}00000';
  //Edit1.Text := '{{{{AA/BB/CC/DD}AB CD{11}{22}DEFG  0123{111/222/333/444}00//{3}{2//}1//{}000///}}}';
  Edit2.Text := OpStr(Edit1.Text);
end;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS