下面是大名鼎鼎的QStrings单元的两个函数,你直接拷贝过去就可以用了,不仅完全符合你<br>的要求,而且速度极快!<br><br>unit Unit1;<br><br>interface<br><br>uses<br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br> StdCtrls;<br><br>type<br> TForm1 = class(TForm)<br> Button1: TButton;<br> procedure Button1Click(Sender: TObject);<br> private<br> { Private declarations }<br> public<br> { Public declarations }<br> end;<br><br>var<br> Form1 : TForm1;<br><br>const<br> ToUpperChars: array[0..255] of Char =<br> (#$00,#$01,#$02,#$03,#$04,#$05,#$06,#$07,#$08,#$09,#$0A,#$0B,#$0C,#$0D,#$0E,#$0F,<br> #$10,#$11,#$12,#$13,#$14,#$15,#$16,#$17,#$18,#$19,#$1A,#$1B,#$1C,#$1D,#$1E,#$1F,<br> #$20,#$21,#$22,#$23,#$24,#$25,#$26,#$27,#$28,#$29,#$2A,#$2B,#$2C,#$2D,#$2E,#$2F,<br> #$30,#$31,#$32,#$33,#$34,#$35,#$36,#$37,#$38,#$39,#$3A,#$3B,#$3C,#$3D,#$3E,#$3F,<br> #$40,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,<br> #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$5B,#$5C,#$5D,#$5E,#$5F,<br> #$60,#$41,#$42,#$43,#$44,#$45,#$46,#$47,#$48,#$49,#$4A,#$4B,#$4C,#$4D,#$4E,#$4F,<br> #$50,#$51,#$52,#$53,#$54,#$55,#$56,#$57,#$58,#$59,#$5A,#$7B,#$7C,#$7D,#$7E,#$7F,<br> #$80,#$81,#$82,#$81,#$84,#$85,#$86,#$87,#$88,#$89,#$8A,#$8B,#$8C,#$8D,#$8E,#$8F,<br> #$80,#$91,#$92,#$93,#$94,#$95,#$96,#$97,#$98,#$99,#$8A,#$9B,#$8C,#$8D,#$8E,#$8F,<br> #$A0,#$A1,#$A1,#$A3,#$A4,#$A5,#$A6,#$A7,#$A8,#$A9,#$AA,#$AB,#$AC,#$AD,#$AE,#$AF,<br> #$B0,#$B1,#$B2,#$B2,#$A5,#$B5,#$B6,#$B7,#$A8,#$B9,#$AA,#$BB,#$A3,#$BD,#$BD,#$AF,<br> #$C0,#$C1,#$C2,#$C3,#$C4,#$C5,#$C6,#$C7,#$C8,#$C9,#$CA,#$CB,#$CC,#$CD,#$CE,#$CF,<br> #$D0,#$D1,#$D2,#$D3,#$D4,#$D5,#$D6,#$D7,#$D8,#$D9,#$DA,#$DB,#$DC,#$DD,#$DE,#$DF,<br> #$C0,#$C1,#$C2,#$C3,#$C4,#$C5,#$C6,#$C7,#$C8,#$C9,#$CA,#$CB,#$CC,#$CD,#$CE,#$CF,<br> #$D0,#$D1,#$D2,#$D3,#$D4,#$D5,#$D6,#$D7,#$D8,#$D9,#$DA,#$DB,#$DC,#$DD,#$DE,#$DF);<br><br>implementation<br><br>{$R *.DFM}<br><br>{<br> 在SourceString中搜索FindString,StartPos是起始搜索位置。如果没搜索到,返回0。区分大小写。<br> 你可以将返回值赋给StartPos,查找下一个匹配的字符串。<br>}<br>function Q_PosStr(const FindString, SourceString: string; StartPos: Integer): Integer;<br>asm<br> PUSH ESI<br> PUSH EDI<br> PUSH EBX<br> PUSH EDX<br> TEST EAX,EAX<br> JE @@qt<br> TEST EDX,EDX<br> JE @@qt0<br> MOV ESI,EAX<br> MOV EDI,EDX<br> MOV EAX,[EAX-4]<br> MOV EDX,[EDX-4]<br> DEC EAX<br> SUB EDX,EAX<br> DEC ECX<br> SUB EDX,ECX<br> JNG @@qt0<br> XCHG EAX,EDX<br> ADD EDI,ECX<br> MOV ECX,EAX<br> JMP @@nx<br>@@fr: INC EDI<br> DEC ECX<br> JE @@qt0<br>@@nx: MOV EBX,EDX<br> MOV AL,BYTE PTR [ESI]<br>@@lp1: CMP AL,BYTE PTR [EDI]<br> JE @@uu<br> INC EDI<br> DEC ECX<br> JE @@qt0<br> CMP AL,BYTE PTR [EDI]<br> JE @@uu<br> INC EDI<br> DEC ECX<br> JE @@qt0<br> CMP AL,BYTE PTR [EDI]<br> JE @@uu<br> INC EDI<br> DEC ECX<br> JE @@qt0<br> CMP AL,BYTE PTR [EDI]<br> JE @@uu<br> INC EDI<br> DEC ECX<br> JNE @@lp1<br>@@qt0: XOR EAX,EAX<br>@@qt: POP ECX<br> POP EBX<br> POP EDI<br> POP ESI<br> RET<br>@@uu: TEST EDX,EDX<br> JE @@fd<br>@@lp2: MOV AL,BYTE PTR [ESI+EBX]<br> CMP AL,BYTE PTR [EDI+EBX]<br> JNE @@fr<br> DEC EBX<br> JE @@fd<br> MOV AL,BYTE PTR [ESI+EBX]<br> CMP AL,BYTE PTR [EDI+EBX]<br> JNE @@fr<br> DEC EBX<br> JE @@fd<br> MOV AL,BYTE PTR [ESI+EBX]<br> CMP AL,BYTE PTR [EDI+EBX]<br> JNE @@fr<br> DEC EBX<br> JE @@fd<br> MOV AL,BYTE PTR [ESI+EBX]<br> CMP AL,BYTE PTR [EDI+EBX]<br> JNE @@fr<br> DEC EBX<br> JNE @@lp2<br>@@fd: LEA EAX,[EDI+1]<br> SUB EAX,[ESP]<br> POP ECX<br> POP EBX<br> POP EDI<br> POP ESI<br>end;<br><br>{ 功能同上,不区分大小写。使用此函数时,要在Interface部分加入ToUpperChars常量数组 }<br>function Q_PosText(const FindString, SourceString: string; StartPos: Integer): Integer;<br>asm<br> PUSH ESI<br> PUSH EDI<br> PUSH EBX<br> TEST EAX,EAX<br> JE @@qt<br> TEST EDX,EDX<br> JE @@qt0<br> MOV ESI,EAX<br> MOV EDI,EDX<br> PUSH EDX<br> MOV EAX,[EAX-4]<br> MOV EDX,[EDX-4]<br> DEC EAX<br> SUB EDX,EAX<br> DEC ECX<br> PUSH EAX<br> SUB EDX,ECX<br> JNG @@qtx<br> ADD EDI,ECX<br> MOV ECX,EDX<br> MOV EDX,EAX<br> MOVZX EBX,BYTE PTR [ESI]<br> MOV AL,BYTE PTR [EBX+ToUpperChars]<br>@@lp1: MOVZX EBX,BYTE PTR [EDI]<br> CMP AL,BYTE PTR [EBX+ToUpperChars]<br> JE @@uu<br>@@fr: INC EDI<br> DEC ECX<br> JE @@qtx<br> MOVZX EBX,BYTE PTR [EDI]<br> CMP AL,BYTE PTR [EBX+ToUpperChars]<br> JE @@uu<br> INC EDI<br> DEC ECX<br> JE @@qtx<br> MOVZX EBX,BYTE PTR [EDI]<br> CMP AL,BYTE PTR [EBX+ToUpperChars]<br> JE @@uu<br> INC EDI<br> DEC ECX<br> JE @@qtx<br> MOVZX EBX,BYTE PTR [EDI]<br> CMP AL,BYTE PTR [EBX+ToUpperChars]<br> JE @@uu<br> INC EDI<br> DEC ECX<br> JNE @@lp1<br>@@qtx: ADD ESP,$08<br>@@qt0: XOR EAX,EAX<br>@@qt: POP EBX<br> POP EDI<br> POP ESI<br> RET<br>@@ms: MOVZX EBX,BYTE PTR [ESI]<br> MOV AL,BYTE PTR [EBX+ToUpperChars]<br> MOV EDX,[ESP]<br> JMP @@fr<br>@@uu: TEST EDX,EDX<br> JE @@fd<br>@@lp2: MOV BL,BYTE PTR [ESI+EDX]<br> MOV AH,BYTE PTR [EDI+EDX]<br> CMP BL,AH<br> JE @@eq<br> MOV AL,BYTE PTR [EBX+ToUpperChars]<br> MOVZX EBX,AH<br> CMP AL,BYTE PTR [EBX+ToUpperChars]<br> JNE @@ms<br>@@eq: DEC EDX<br> JNZ @@lp2<br>@@fd: LEA EAX,[EDI+1]<br> POP ECX<br> SUB EAX,[ESP]<br> POP ECX<br> POP EBX<br> POP EDI<br> POP ESI<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> iPos: Integer;<br>begin<br> iPos := Q_PosStr('x', 'wo shi xiaobenben', 1);<br> if iPos = 0 then<br> Caption := '没找到!'<br> else<br> Caption := '找到了,第一次出现的位置是:' + IntToStr(iPos);<br>end;<br><br>end.<br>