一个非常复杂的字符串的拆分!(200分)

  • 主题发起人 主题发起人 redwh
  • 开始时间 开始时间
R

redwh

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样拆分如下字符:
(市场A表(29,3)+市场B表(30,3)+市场C表(31,3))*[2000]+市场C表(31,5)/[1000]
拆分成
(a+b+c)*2000+d/1000
我搞了好久了,怎么都找不到规律!请大家帮个忙,分可以再加!谢了!
 
看不明白呀!
你能不能说详细以下。
市场A表(29,3)+市场B表(30,3)+市场C表(31,3))*[2000]+市场C表(31,5)/[1000]
是字符串吗?
 
太难拆分,按照下面的结果,人都拆不出来,何况是计算机了
 
是的,是从文本文件里读出来的字符串,这只是其中的一行,不是每一行都是这样的,
但大致的格式差不多,形如:
(市场B表(27,3)+市场C表(28,3))/[1000],

(市场B表(29,3)+市场B表(30,3)+市场B表(31,3))/[1000]
 
意思不明确,应该比较容易的,再说一下
 
分两次拆分。
第一次,拆分"/"。
然后去掉第二个字符串的第一个"["与最后一个字符"]"。
第二次,拆分"+"。
然后去掉第二次拆分得到的第一个字符串的第一个字符"(",去掉最后一个字符串的最后一个字符")"。
 
这是对电子表格的计算公式。通过分解出形如:市场B表(29,3),然后到表格中取到
对应的值,然后按公式进行计算
 
分不够可以再加,希望能有一个比较通用的结果。再次谢过!
 
这是个多表取数计算公式,你可以先定义计算公式,然后将各个计算参数单独放到一个表中,
计算时先找到每个参数的值,然后根据公式将各个参数的值copy进去就可以了,剩下的就是一个
数学表达式,计算应该没问题了。
 
搞一个状态机,把所有的状态都填入表格里,依照读入的字符串进行状态转换。
^_^
 
给出一个最复杂的串看看
 
procedure TForm1.Button1Click(Sender: TObject);
var
s,s1,s2:string;
ss:TStrings;
i,n,p:integer;
ws:WideString;
begin
s:='(市场A表(29,3)+市场B表(30,3)+市场C表(31,3))*[2000]+市场D表(31,5)/[1000]';
//
ss:=TStringList.Create ;
ss.CommaText:=s;

s2:='';
for i:=0 to ss.count-1 do
begin
if i>0 then begin
s1:=ss;
p:=pos(')',s1);
ss:=copy(s1,p+1,length(s1)-p);
end;
if i<ss.count-1 then begin
s1:=ss;
p:=integer(StrRScan(pchar(@s1[1]),'('))-integer(@s1[1]);
ss:=copy(s1,1,p);
end;
s2:=s2+trim(ss);
end;
ss.free;

s2:=stringReplace(s2,'[','',[rfReplaceAll]);
s2:=stringReplace(s2,']','',[rfReplaceAll]);

ws:=WideString(s2);
s2:='';
for i:=1 to length(ws) do
if length(string(ws))=1 then s2:=s2+ws;
showmessage(lowerCase(s2));
end;
 
上面已经是最复杂的了。我已经解决了转化后的的字符串表达式的计算问题,现在的问题
就是,怎么将上面表达式转成字符串!
 
何意?替你白忙一场!
 
to jsxjd:
不是这个意思,你的思路是方法是正确的。我说的解决了(a+b+c)*2000+d/1000的字符串的
计算问题。不过我想你还是有点误会了(a+b+c)*2000+d/1000中的a,b,c,d是一个变量,a是通
过“市场A表(29,3)”再表格中得到的值。
有了你的思路,我想也差不多了。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
E: TEdit;
procedure Button1Click(Sender: TObject);
private
S:STRING;
procedure DelSpecStr;
procedure DelStr(DelStr: string);
procedure ClearStr;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.DelStr(DelStr:string);
var
PosIndex,LengthCount:integer;
begin
while Pos(DelStr, S) > 0 do
begin
PosIndex:=pos(DelStr, S);
LengthCount:=length(DelStr);
Delete(S,PosIndex,LengthCount);
end;
end;

procedure TForm1.DelSpecStr;
var
PosIndex,LengthCount:integer;
begin
while Pos(',', S) > 0 do
begin
PosIndex:=pos(',', S) - 3;//想删除(31,5)格式
LengthCount:=6;
Delete(S,PosIndex,LengthCount);
end;
end;

//(a+b+c)*2000+d/1000
//S:='(市场A表(29,3)+市场B表(30,3)+市场C表(31,3))*[2000]+市场C表(31,5)/[1000]'
procedure TForm1.ClearStr;
begin
DelStr('市场');
DelStr('表');
DelStr('[');
DelStr(']');
DelSpecStr;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
S:='(市场A表(29,3)+市场B表(30,3)+市场C表(31,3))*[2000]+市场C表(31,5)/[1000]';
ClearStr ;
E.Text:= s;
end;

END.
 
ok了吧?我测试过的
 
TO redwh:
兄弟,测试通过了吗?
 
计算表达式的值,可以借助 SQL 查询!!

var
..............

a:=100;
b:=1000;
c:=12;
d:=13;
s:='(a+b+c)*2000+d/1000';
//把 a,b,c,d 全部换成 %d
// 这样 s='(%d+%d+%d)*2000+%d/1000';
s:=Format(s,[a,b,c,d]);

query.sql.clear;
query.sql.add('select dintinct '+s+' from ATable')
///////////// sql Server 后面的表都不需要
Query.open;
x:=query.fields[0].asInteger;

以上是大意!!!
 
To sunrainwang:
谢谢你的答案!
你的也很好,不过你也误会了我的意思。可能是我没表达清楚,首先我要从这个表达式
(市场A表(29,3)+市场B表(30,3)+市场C表(31,3))*[2000]+市场C表(31,5)/[1000]
中读出“市场A表(29,3)”,“市场B表(30,3)”。。。然后到表格中找到对应的数值,
然后带入表达式中计算楚结果。
如果象你那样只能得到表达式,不能知道a,b,c的具体的值。
注意:
a,b,c在这里不能等同字符串里面的“A”,"B","C",它是一个对应的表格的值。

再次谢过!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
606
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部