他们之间是有空格的!!,我想用一个代码来实现读取aaa.txt里面的内容,【精确】查找aaa.txt 里面有没有某些字符串,!!!
例如我想知道aaa.txt里有没有 ab 这个字符串,用POS返回来的消息会说他有(因为aaa.txt里面有abc 这个字符,
我知道在delphi 里面的POS能查找字符串,但是只能是模糊地查找,
而我想精确的查找,有方法吗?各位不吝赐教几句话啊,!!!
13 个解决方案
#1
你可以使用TStringList的Delimiter和DelimitedText属性
DelimitedText是指定一个字符串,Delimiter是指定一个分割的字符,比如:
sl.Delimiter := ',';
sl.DelimitedText := 'a,bb,ccc,dddd';
然后可以用TStringList的IndexOf来判断是否存在某个字符串
DelimitedText是指定一个字符串,Delimiter是指定一个分割的字符,比如:
sl.Delimiter := ',';
sl.DelimitedText := 'a,bb,ccc,dddd';
然后可以用TStringList的IndexOf来判断是否存在某个字符串
#2
不明白楼主的精确是怎么定义的?
Pos函数可并不支持模糊查询哦, 在'abc abcd 111 111'中用Pos寻找'ab'返回能找到这个完全正常啊。
如果楼主的意思是想整词匹配(Whole Words Only)的话,你可以先用Pos寻找,然后判断找到的内容后面的一个字符,如果这个字符是空格或标点符号或者后面无字符,则说明符合整词匹配。
Pos函数可并不支持模糊查询哦, 在'abc abcd 111 111'中用Pos寻找'ab'返回能找到这个完全正常啊。
如果楼主的意思是想整词匹配(Whole Words Only)的话,你可以先用Pos寻找,然后判断找到的内容后面的一个字符,如果这个字符是空格或标点符号或者后面无字符,则说明符合整词匹配。
#3
给个整词匹配查找的例子:
uses Strutils;
function Pos_WholeWordsOnly(sFind, sData: String; iStart: Integer = 1): Integer;
var
iPos : Integer;
AChar: Char;
begin
Result := 0;
repeat
iPos := PosEx(sFind, sData, iStart);
if iPos > 0 then
begin
iStart := iPos + Length(sFind);
if iStart >= Length(sData) then
begin
Result := iPos;
break;
end
else begin
AChar := sData[iStart];
if not ((AChar >= 'A') and (AChar <= 'Z')) and
not ((AChar >= 'a') and (AChar <= 'z')) then
begin
Result := iPos;
break;
end;
end;
end;
until iPos <= 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc abcd 111')));
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc ab cd 111')));
end;
uses Strutils;
function Pos_WholeWordsOnly(sFind, sData: String; iStart: Integer = 1): Integer;
var
iPos : Integer;
AChar: Char;
begin
Result := 0;
repeat
iPos := PosEx(sFind, sData, iStart);
if iPos > 0 then
begin
iStart := iPos + Length(sFind);
if iStart >= Length(sData) then
begin
Result := iPos;
break;
end
else begin
AChar := sData[iStart];
if not ((AChar >= 'A') and (AChar <= 'Z')) and
not ((AChar >= 'a') and (AChar <= 'z')) then
begin
Result := iPos;
break;
end;
end;
end;
until iPos <= 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc abcd 111')));
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc ab cd 111')));
end;
#4
PosEx函数
#5
楼主对POS函数的理解是错误的。
另:要实现特殊的功能,如果某函数不够用,完全可以自己写函数。
另:要实现特殊的功能,如果某函数不够用,完全可以自己写函数。
#6
刚才写了一个字符串函数,(也不知是不是Delphi已提供这种功能的函数,如提供,那一定比我写得好得好 ^_^ ):
function MyPos_1(const SubStr, S : string) : integer;//返回子串个数
var
I : integer;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
if CompareMem(@S[I], @SubStr[1], Length(SubStr)) then
Result := Result + 1;
end;
procedure TForm1.Button1Click(Sender: TObject);// 测试
begin
ShowMessage(Format('字串"abc123abc123abc"*有%d个子串"abc"',[MyPos_1('abc','abc123abc123abc')]));
end;
function MyPos_1(const SubStr, S : string) : integer;//返回子串个数
var
I : integer;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
if CompareMem(@S[I], @SubStr[1], Length(SubStr)) then
Result := Result + 1;
end;
procedure TForm1.Button1Click(Sender: TObject);// 测试
begin
ShowMessage(Format('字串"abc123abc123abc"*有%d个子串"abc"',[MyPos_1('abc','abc123abc123abc')]));
end;
#7
再比如我又给你写了一个:(模糊查询的)我的代码可能不是高效的,但应该可以用。
function MyPos_2(const SubStr, S : string) : integer; //模糊查询,返回子串个数,一个?代表一个模糊字符
procedure ChangeStr(const Sub : string; var SS : string);
var I : integer;
begin
for I := 1 to Length(Sub) do
if Sub[I]='?' then SS[I] := '?';
end;
var
I : integer;
sTemp : string;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
begin
sTemp := Copy(S, I, Length(SubStr));
ChangeStr(SubStr, sTemp);
if CompareMem(@SubStr[1], @sTemp[1], Length(SubStr)) then
Result := Result + 1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Format('字串"abc123a0c123a-c"*有%d个模糊子串"a?c"',[MyPos_2('q?c','abc123a0c123a-c')]));
end;
function MyPos_2(const SubStr, S : string) : integer; //模糊查询,返回子串个数,一个?代表一个模糊字符
procedure ChangeStr(const Sub : string; var SS : string);
var I : integer;
begin
for I := 1 to Length(Sub) do
if Sub[I]='?' then SS[I] := '?';
end;
var
I : integer;
sTemp : string;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
begin
sTemp := Copy(S, I, Length(SubStr));
ChangeStr(SubStr, sTemp);
if CompareMem(@SubStr[1], @sTemp[1], Length(SubStr)) then
Result := Result + 1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Format('字串"abc123a0c123a-c"*有%d个模糊子串"a?c"',[MyPos_2('q?c','abc123a0c123a-c')]));
end;
#8
可能是我的表达能力有问题,的确是想实现"整词匹配"的功能,但是很奇怪.我用POS时,也不能完全匹配一个词语啊.就是说只要一个词里面包含我所要的关键词,POS就会找到它,这正是我疑惑的地方,
#9
楼主你得先把"整词匹配"的定义弄清楚,然后才有可能知道如何编程。
#10
jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现.
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
这是我在CSDN的第一张帖,就有这么多热心的网民,真的很谢谢大家,!!!
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
这是我在CSDN的第一张帖,就有这么多热心的网民,真的很谢谢大家,!!!
#11
谢谢大家!!
#12
jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现.
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
------------------------------
你在说些啥呀..... 晕
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
------------------------------
你在说些啥呀..... 晕
#13
虽然已结贴,还是要说一下:
1、在我回贴之前,楼主你是否具体说过你要的函数是什么样的功能?-----你只说“DELPHI里面除了POS就没有别的查找字串的函数吗”。
2、我的两个函数,只是在用例子说明“要实现特殊的功能,如果某函数不够用,完全可以自己写函数”这句话。两个函数都明确地带有注释,标明函数的功能。我无法象孙悟空那样钻到你肚子里去看一下你在想什么。
3、POS函数实现什么样的功能?怎么用?楼主了解吗?----“我要的是完全的匹配.多一个字符,少一个也不能”--------POS函数实现这样的功能,不够你用吗?
4、建议楼主过一段时间之后(等你自认为你有了一些进步之后),再回头看一下此贴。
5、汗啊......
1、在我回贴之前,楼主你是否具体说过你要的函数是什么样的功能?-----你只说“DELPHI里面除了POS就没有别的查找字串的函数吗”。
2、我的两个函数,只是在用例子说明“要实现特殊的功能,如果某函数不够用,完全可以自己写函数”这句话。两个函数都明确地带有注释,标明函数的功能。我无法象孙悟空那样钻到你肚子里去看一下你在想什么。
3、POS函数实现什么样的功能?怎么用?楼主了解吗?----“我要的是完全的匹配.多一个字符,少一个也不能”--------POS函数实现这样的功能,不够你用吗?
4、建议楼主过一段时间之后(等你自认为你有了一些进步之后),再回头看一下此贴。
5、汗啊......
#1
你可以使用TStringList的Delimiter和DelimitedText属性
DelimitedText是指定一个字符串,Delimiter是指定一个分割的字符,比如:
sl.Delimiter := ',';
sl.DelimitedText := 'a,bb,ccc,dddd';
然后可以用TStringList的IndexOf来判断是否存在某个字符串
DelimitedText是指定一个字符串,Delimiter是指定一个分割的字符,比如:
sl.Delimiter := ',';
sl.DelimitedText := 'a,bb,ccc,dddd';
然后可以用TStringList的IndexOf来判断是否存在某个字符串
#2
不明白楼主的精确是怎么定义的?
Pos函数可并不支持模糊查询哦, 在'abc abcd 111 111'中用Pos寻找'ab'返回能找到这个完全正常啊。
如果楼主的意思是想整词匹配(Whole Words Only)的话,你可以先用Pos寻找,然后判断找到的内容后面的一个字符,如果这个字符是空格或标点符号或者后面无字符,则说明符合整词匹配。
Pos函数可并不支持模糊查询哦, 在'abc abcd 111 111'中用Pos寻找'ab'返回能找到这个完全正常啊。
如果楼主的意思是想整词匹配(Whole Words Only)的话,你可以先用Pos寻找,然后判断找到的内容后面的一个字符,如果这个字符是空格或标点符号或者后面无字符,则说明符合整词匹配。
#3
给个整词匹配查找的例子:
uses Strutils;
function Pos_WholeWordsOnly(sFind, sData: String; iStart: Integer = 1): Integer;
var
iPos : Integer;
AChar: Char;
begin
Result := 0;
repeat
iPos := PosEx(sFind, sData, iStart);
if iPos > 0 then
begin
iStart := iPos + Length(sFind);
if iStart >= Length(sData) then
begin
Result := iPos;
break;
end
else begin
AChar := sData[iStart];
if not ((AChar >= 'A') and (AChar <= 'Z')) and
not ((AChar >= 'a') and (AChar <= 'z')) then
begin
Result := iPos;
break;
end;
end;
end;
until iPos <= 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc abcd 111')));
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc ab cd 111')));
end;
uses Strutils;
function Pos_WholeWordsOnly(sFind, sData: String; iStart: Integer = 1): Integer;
var
iPos : Integer;
AChar: Char;
begin
Result := 0;
repeat
iPos := PosEx(sFind, sData, iStart);
if iPos > 0 then
begin
iStart := iPos + Length(sFind);
if iStart >= Length(sData) then
begin
Result := iPos;
break;
end
else begin
AChar := sData[iStart];
if not ((AChar >= 'A') and (AChar <= 'Z')) and
not ((AChar >= 'a') and (AChar <= 'z')) then
begin
Result := iPos;
break;
end;
end;
end;
until iPos <= 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc abcd 111')));
ShowMessage (IntToStr(Pos_WholeWordsOnly('ab', 'abc ab cd 111')));
end;
#4
PosEx函数
#5
楼主对POS函数的理解是错误的。
另:要实现特殊的功能,如果某函数不够用,完全可以自己写函数。
另:要实现特殊的功能,如果某函数不够用,完全可以自己写函数。
#6
刚才写了一个字符串函数,(也不知是不是Delphi已提供这种功能的函数,如提供,那一定比我写得好得好 ^_^ ):
function MyPos_1(const SubStr, S : string) : integer;//返回子串个数
var
I : integer;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
if CompareMem(@S[I], @SubStr[1], Length(SubStr)) then
Result := Result + 1;
end;
procedure TForm1.Button1Click(Sender: TObject);// 测试
begin
ShowMessage(Format('字串"abc123abc123abc"*有%d个子串"abc"',[MyPos_1('abc','abc123abc123abc')]));
end;
function MyPos_1(const SubStr, S : string) : integer;//返回子串个数
var
I : integer;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
if CompareMem(@S[I], @SubStr[1], Length(SubStr)) then
Result := Result + 1;
end;
procedure TForm1.Button1Click(Sender: TObject);// 测试
begin
ShowMessage(Format('字串"abc123abc123abc"*有%d个子串"abc"',[MyPos_1('abc','abc123abc123abc')]));
end;
#7
再比如我又给你写了一个:(模糊查询的)我的代码可能不是高效的,但应该可以用。
function MyPos_2(const SubStr, S : string) : integer; //模糊查询,返回子串个数,一个?代表一个模糊字符
procedure ChangeStr(const Sub : string; var SS : string);
var I : integer;
begin
for I := 1 to Length(Sub) do
if Sub[I]='?' then SS[I] := '?';
end;
var
I : integer;
sTemp : string;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
begin
sTemp := Copy(S, I, Length(SubStr));
ChangeStr(SubStr, sTemp);
if CompareMem(@SubStr[1], @sTemp[1], Length(SubStr)) then
Result := Result + 1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Format('字串"abc123a0c123a-c"*有%d个模糊子串"a?c"',[MyPos_2('q?c','abc123a0c123a-c')]));
end;
function MyPos_2(const SubStr, S : string) : integer; //模糊查询,返回子串个数,一个?代表一个模糊字符
procedure ChangeStr(const Sub : string; var SS : string);
var I : integer;
begin
for I := 1 to Length(Sub) do
if Sub[I]='?' then SS[I] := '?';
end;
var
I : integer;
sTemp : string;
begin
Result := 0;
for I := 1 to Length(S)-Length(SubStr)+1 do
begin
sTemp := Copy(S, I, Length(SubStr));
ChangeStr(SubStr, sTemp);
if CompareMem(@SubStr[1], @sTemp[1], Length(SubStr)) then
Result := Result + 1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Format('字串"abc123a0c123a-c"*有%d个模糊子串"a?c"',[MyPos_2('q?c','abc123a0c123a-c')]));
end;
#8
可能是我的表达能力有问题,的确是想实现"整词匹配"的功能,但是很奇怪.我用POS时,也不能完全匹配一个词语啊.就是说只要一个词里面包含我所要的关键词,POS就会找到它,这正是我疑惑的地方,
#9
楼主你得先把"整词匹配"的定义弄清楚,然后才有可能知道如何编程。
#10
jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现.
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
这是我在CSDN的第一张帖,就有这么多热心的网民,真的很谢谢大家,!!!
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
这是我在CSDN的第一张帖,就有这么多热心的网民,真的很谢谢大家,!!!
#11
谢谢大家!!
#12
jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现.
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
------------------------------
你在说些啥呀..... 晕
lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.
------------------------------
你在说些啥呀..... 晕
#13
虽然已结贴,还是要说一下:
1、在我回贴之前,楼主你是否具体说过你要的函数是什么样的功能?-----你只说“DELPHI里面除了POS就没有别的查找字串的函数吗”。
2、我的两个函数,只是在用例子说明“要实现特殊的功能,如果某函数不够用,完全可以自己写函数”这句话。两个函数都明确地带有注释,标明函数的功能。我无法象孙悟空那样钻到你肚子里去看一下你在想什么。
3、POS函数实现什么样的功能?怎么用?楼主了解吗?----“我要的是完全的匹配.多一个字符,少一个也不能”--------POS函数实现这样的功能,不够你用吗?
4、建议楼主过一段时间之后(等你自认为你有了一些进步之后),再回头看一下此贴。
5、汗啊......
1、在我回贴之前,楼主你是否具体说过你要的函数是什么样的功能?-----你只说“DELPHI里面除了POS就没有别的查找字串的函数吗”。
2、我的两个函数,只是在用例子说明“要实现特殊的功能,如果某函数不够用,完全可以自己写函数”这句话。两个函数都明确地带有注释,标明函数的功能。我无法象孙悟空那样钻到你肚子里去看一下你在想什么。
3、POS函数实现什么样的功能?怎么用?楼主了解吗?----“我要的是完全的匹配.多一个字符,少一个也不能”--------POS函数实现这样的功能,不够你用吗?
4、建议楼主过一段时间之后(等你自认为你有了一些进步之后),再回头看一下此贴。
5、汗啊......