【【【【DELPHI里面除了POS就没有别的查找字串的函数吗?????

时间:2021-08-03 16:15:28
现在在程序下面有一个aaa.txt 里面的内容是 abc abcd 11 111 

他们之间是有空格的!!,我想用一个代码来实现读取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来判断是否存在某个字符串

#2


不明白楼主的精确是怎么定义的?
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;

#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;

#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;

#8


可能是我的表达能力有问题,的确是想实现"整词匹配"的功能,但是很奇怪.我用POS时,也不能完全匹配一个词语啊.就是说只要一个词里面包含我所要的关键词,POS就会找到它,这正是我疑惑的地方,

#9


楼主你得先把"整词匹配"的定义弄清楚,然后才有可能知道如何编程。

#10


jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现. 

lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.

 这是我在CSDN的第一张帖,就有这么多热心的网民,真的很谢谢大家,!!!

#11


谢谢大家!!

#12


jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现. 

lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.

------------------------------

你在说些啥呀.....  晕

#13


虽然已结贴,还是要说一下:

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来判断是否存在某个字符串

#2


不明白楼主的精确是怎么定义的?
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;

#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;

#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;

#8


可能是我的表达能力有问题,的确是想实现"整词匹配"的功能,但是很奇怪.我用POS时,也不能完全匹配一个词语啊.就是说只要一个词里面包含我所要的关键词,POS就会找到它,这正是我疑惑的地方,

#9


楼主你得先把"整词匹配"的定义弄清楚,然后才有可能知道如何编程。

#10


jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现. 

lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.

 这是我在CSDN的第一张帖,就有这么多热心的网民,真的很谢谢大家,!!!

#11


谢谢大家!!

#12


jadeluo(秀峰) 的代码正是我想要的,例如 现在有两个字符串 ab abcc 而我要检查这两个字符串里面有没有 abc 这个字符串, jadeluo(秀峰) 的代码可以实现. 

lihuasoft(学习低调做人) 的代码 则只可以判断 ab 里面没有 abc , 判断到abcc 里面有 1 个abc . 我要的是完全的匹配.多一个字符,少一个也不能.

------------------------------

你在说些啥呀.....  晕

#13


虽然已结贴,还是要说一下:

1、在我回贴之前,楼主你是否具体说过你要的函数是什么样的功能?-----你只说“DELPHI里面除了POS就没有别的查找字串的函数吗”。

2、我的两个函数,只是在用例子说明“要实现特殊的功能,如果某函数不够用,完全可以自己写函数”这句话。两个函数都明确地带有注释,标明函数的功能。我无法象孙悟空那样钻到你肚子里去看一下你在想什么。

3、POS函数实现什么样的功能?怎么用?楼主了解吗?----“我要的是完全的匹配.多一个字符,少一个也不能”--------POS函数实现这样的功能,不够你用吗?

4、建议楼主过一段时间之后(等你自认为你有了一些进步之后),再回头看一下此贴。

5、汗啊......