请教字符串算法,很有意思的问题 (300分)

A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
已知一html串s,如"<font face="Arial"><small>2001.4.1</small></font>"
该串的变形存在于一文本文件中,
变形描述:html属性之间,html标记之间增加空格或回车换行,如
"<font face="Arial" ><small>
2001.4.1</small></font>"这样的字符串,
现在求在文本文件中如何将这个变形找出来,并得到它在文件中的位置,类似Pos函数。

很有意思的问题,向大家讨教。
 
C

copy_paste

Unregistered / Unconfirmed
GUEST, unregistred user!
你是说那么HTML代码空格多了,然后在查看的时候很不顺眼,是不这意思?
 
L

LiChaoHui

Unregistered / Unconfirmed
GUEST, unregistred user!
用状态机来做,很容易判断多余的空格或回车的情况
 
Z

zjan521

Unregistered / Unconfirmed
GUEST, unregistred user!
模糊点找,很多连续空格看成一个,一个空格在某种情况下看作没有[red]face="Arial" >[/red]
回车看成空格,HTML中好像也没问题
 
L

LiChaoHui

Unregistered / Unconfirmed
GUEST, unregistred user!
很无聊的问题,用来做什么呀?看看有没有比较简单的方法
 
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
to copy_paste:
不是看不顺眼,是要这个参杂着多余空格的字符串用程序找出来,已知的是不含多余空格标准的字符串。

楼上的最好给些实例啊,我再多给300分也没有问题。
 
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
问题不无聊,看我像无聊的人嘛,现在就是有个项目中碰到了这样一个问题。
 
M

MrMengyi

Unregistered / Unconfirmed
GUEST, unregistred user!
agree LiChaoHui
这样做比较标准
 
X

xeen

Unregistered / Unconfirmed
GUEST, unregistred user!
这问题不难吧,比较的时候:
回车:直接去掉(删除).
空格:循环地把两个空格替换为一个空格(可以用stringreplace函数),直到
找不到两个空格为止.
 
Z

zhukewen

Unregistered / Unconfirmed
GUEST, unregistred user!
先把要查找的字符串去掉空格
"<font face="Arial"><small>2001.4.1</small></font>"
=> "<fontface="Arial"><small>2001.4.1</small></font>"
再把文本文件的空格全去掉
"<font face="Arial" ><small> 2001.4.1</small></font>"
=> "<fontface="Arial"><small>2001.4.1</small></font>"
这样就可以查找了(注意:有些空格可能是跳格符)
 
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上的,这样的确可以找到,但是已经丢失了原有的位置信息了
例如
要在"dsa sdf < font>"中查找"<font>",我希望得到9这个位置
123456789........
如果先将空格回车都过滤了,只能得到7。

另外,文本中本来就可能含有空格,例如"<a href="#">a b c</a>"
 
X

xeen

Unregistered / Unconfirmed
GUEST, unregistred user!
那你也可以遍历文本,判断一下在'<......>'之间的就去掉多余的空格与
回车.
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
就是就是,自己写个函数,去了一个以上空格和换行,我就写了~
 
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
要在"dsa sdf < font>"中查找"<font>",我希望得到9这个位置

来自:doll_paul, 时间:2003-2-12 16:48:00, ID:1617916
就是就是,自己写个函数,去了一个以上空格和换行,我就写了~

这样简单的话我要出300分吗?
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
原来如此,呵呵,理解错了~

那你只能还是先去除空格,并记录空格数和位置,然后比较!

或把<font>分解,就像搜索引情的关键字分解的算法一样!
 
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
感谢楼上那么多兄弟的回复,可惜大多数提的只是方案,正确性也都不可考。

这样吧,有谁可以提供代码(附上注释,相信代码也不会很长),
经测试一经通过,马上结贴给分600。
 
L

LiChaoHui

Unregistered / Unconfirmed
GUEST, unregistred user!
ok,代码正在编写中...
 
Z

zhukewen

Unregistered / Unconfirmed
GUEST, unregistred user!
function FindInText(FileName,SubStr: String): Integer;
//FileName:你的Text文件名,包括路径
//SubStr:要查找的字符串
procedure RemoveSpace(var Str: String);
var n: Integer;
begin
//去掉空格
n := pos(' ',Str);
while n > 0 do
begin
Delete(Str,n,1);
n := pos(' ',Str);
end;
//去掉Tab
n := pos(#7,Str);
while n > 0 do
begin
Delete(Str,n,1);
n := pos(#7,Str);
end;
end;
var
ts: TStringList;
s,ss: String;
begin
Result := 0;
ts := TStringList.Create;
try
ts.LoadFromFile(FileName);
s := SubStr;
RemoveSpace(s);
ss := ts.Text;
RemoveSpace(ss);
Result := pos(s,ss);
finally
ts.Free;
end;
end;
end;
 
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢zhukewen的代码,但是这样得出的结果是去掉空格后文件内容中的位置,而不是变形字串在
原文件内容中的物理位置。

RemoveSpace稍微改动了一下,这样可读性和效率稍微好一些吧
procedure RemoveSpace(var Str: String);
begin
S := StringReplace(S, ' ', '', [rfReplaceAll]);
S := StringReplace(S, #7, '', [rfReplaceAll]);
S := StringReplace(S, #13#10, '', [rfReplaceAll]);
end;
 
C

copy_paste

Unregistered / Unconfirmed
GUEST, unregistred user!
const
S1 = '<font face="Arial"><small>2001.4.1</small></font>';
S2 = '<font face="Arial" ><small> ' + #13#10 +
'2001.4.1</small></font>';
S3 = '<font face="Arial" ><small> ' + #13#10 +
'2001 .4. 1</small></font>';
Source = 'other msg' + S2 + 'other msg';

你想做:给出S1,Source,找S1的可能变形S2(S3)在Source的位置是不是这意思?
这个变形而且是不一定只有S2, 或者S3,除了HTML的语法"<html>...."还包括HTML语法
里面的内存,如"2001.4.1"这里面的,也可能包含空格。
你所需要的求的是,在Source中S的变形的Pos,是不是这意思?

老兄,上面看了那么多,我还没明白你的意思。看来偶天生愚笨那。。。。
 
顶部