请教一个字符串算法!(200分)

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一个字符串,
String s="'ab;c;k';888;'1',2,'3;';";
我想把它变成
String s="'ab;c;k'|888|'1',2,'3;'|";
请问我该样写这个转换函数。
这里的转换规则应该是:如果";"不是被''或"
"包含的,则这个";"是个分隔符,否则是一个字符,不是分隔符。
谢谢!
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
BOK: TButton;
BConcer: TButton;
Edit1: TEdit;
procedure BConcerClick(Sender: TObject);
procedure BOKClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BConcerClick(Sender: TObject);
begin
close;
end;

procedure TForm1.BOKClick(Sender: TObject);
var
str,dtr:string;
I: Integer;
d,s:boolean;
f:integer;
begin
str:=edit1.Text;
dtr:=str;
d:=false;
s:=false;
i:=1;
f:=0;
//双引号34,单引号39,冒号58,分号59
for I := 1 to length(str)do
case str of
chr(34):d:=not d;
chr(39):s:=not s;
chr(59):if d or s then
dtr:=str else
dtr:='|';
end;
showmessage(dtr);
end;

end.
 
你的包含应该是成对的吧,也就是第一个单引号和第二个单引号组成一个包含,然后第三个和第四个组成一个包含,依次类推。
public String test(String intos){
String s = new String(intos);
String temps = null;
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();
int pos = -1;
pos = s.indexOf("'",0);
while(pos>=0)
{
l1.add(new Integer(pos));
pos = s.indexOf("'",pos+1);
}
pos = -1;
pos = s.indexOf("/"",0);
while(pos>=0)
{
l2.add(new Integer(pos));
pos = s.indexOf("/"",pos+1);
}
boolean change = true;
pos = s.indexOf(";",0);
while(pos>=0)
{
int i = 0;
for(int j=1;j<=(l1.size()/2);j++)
{
Integer ia = (Integer)l1.get(i++);
int a = ia.intValue();
Integer ib = (Integer)l1.get(i++);
int b = ib.intValue();
if ((pos>a) && (pos<b)) {
change = false;
break;
}
}
i = 0;
if(change == true)
{
for(int j=1;j<=(l2.size()/2);j++)
{
Integer ia = (Integer)l2.get(i++);
int a = ia.intValue();
Integer ib = (Integer)l2.get(i++);
int b = ib.intValue();
if ((pos>a) && (pos<b)) {
change = false;
break;
}
}
}
if(change == true)
{
temps = s.substring(0,pos);
s = temps+&quot;|&quot;+s.substring(pos+1,s.length());
}
change = true;
pos = s.indexOf(&quot;;&quot;,pos+1);
}
return s;
}
 
我来段简洁的!
var
c:char;
inConst:boolean;
i:integer;
begin
inConst:=false;
c:=#0;
for i:=1 to length(s)do
begin
case s of
'''','&quot;':if inConst and (s=c) then
begin

c:=#0;
inConst:=false;
end else
begin
c:=s;
inConst:=true;
end;

';': if not inConst then
s:='|';
end;
end;
end;
 
newsmile 的算法必须保证双引号和单引号不交叉才有效,象这样的字符串就不能处理了:
&quot;a,',&quot;;&quot;1,2,3&quot;,遇到分号时,s是true,分号不会被替换。
我的算法允许单个双引号或单引号出现于成对的另外引号中。
其实这类似于允许字符串常量用单双引号定义都可以。
 
这个问题的分类是JAVA啊
 
跟蹤本問題
 
楼主,不好意思了,鄙人没看清分类浪费了您的地盘,其他兄弟也被误导了,对不起!
 
public static String fixStringWithDyn(String strI,String delim,String nDelim){
String str = &quot;&quot;;
boolean inS = false;
boolean inD = false;
for (int i=0;i<strI.length();i++)
{
if (strI.charAt(i) == '/'')
{
if (inS == true)
inS = false;
else

inS = true;
}
if (strI.charAt(i) == '/&quot;')
{
if (inD == true)
inD = false;
else

inD = true;
}
if (inS == false && inD == false && ((&quot;&quot;+strI.charAt(i)).equals(delim)))
str += nDelim;
else
str += strI.charAt(i);
}
return str;
}

这个是java的,对付分隔符是一个字母的,可以了。
 
后退
顶部