Delphi:高级字符串搜索命令

Delphi:高级字符串搜索命令,delphi,Delphi,Kenneth是一个字符串。假设它包含“justabcsome123texthaha” 我已经知道了: 要查找文本,请执行以下操作: if(pos('bcsome12',Kenneth) > 0) then 要检查长度,请执行以下操作: if(Length('Kenneth') > 10) then 问题1: 我想查找'texthaha',但前提是它位于字符串末尾 if(pos('texthaha',Kenneth) > 0) then 遗憾的是,即使在中间,它也会在任何

Kenneth
是一个字符串。假设它包含
“justabcsome123texthaha”

我已经知道了:

要查找文本,请执行以下操作:

if(pos('bcsome12',Kenneth) > 0) then
要检查长度,请执行以下操作:

if(Length('Kenneth') > 10) then
问题1:

我想查找
'texthaha'
,但前提是它位于字符串末尾

if(pos('texthaha',Kenneth) > 0) then
遗憾的是,即使在中间,它也会在任何地方找到它。有简单的方法吗

问题2:

是否有一种简单的搜索方法,但使用
*
(中间的任何字符)

例如,如果我想搜索
bcsome1*3text
,我不在乎
*
是什么字符。我想这叫通配符,不是吗

if(pos('bcsome1'*'3text',Kenneth) > 0) then
我知道上面的方法行不通。但有类似的方法吗?
编辑:可能很重要:*使用的Delphi版本非常旧,不确定版本,但它是2006年的版本。

要获取最后一次出现的内容,请尝试
lastdimiter
(请参阅)。有关通配符,请参见此。

StrUtils
单元中有函数和
EndsText()
(最后一个不区分大小写)

但是,您可以很容易地使用已知函数提供所需的功能(Pos在fresh Delphi中也使用第三个参数重载了版本):

或@Sertac Akyuz提出的变体:

if Copy(S, NPos, Length(Sub)) = Sub ...
第二个问题可以用类似函数的方法解决


Regex(现代德尔菲语中的TRegex)当然可以实现你的目标,但对你的情况来说可能有点过分。至少在你问题的第一部分,你可以看一下。如果你知道比赛开始的位置,你当然可以做数学题,两个字符串的长度是多少?试着从菜单中选择help->about。这是一个用delphi编写的独立程序,这就是为什么我不能使用about来检查版本对不起。但正如我在2006年所说的,所以它很旧,没有所有关于通配符的内容。答案:我用
尝试了TRegEx命令,如果TRegEx.IsMatch('abcdef','abcd.f'),那么
。。。它给了我这个错误:错误:未声明的标识符:“TRegEx”,所以使用的delphi版本可能太旧了,没有。**有其他选择吗?**在问题或标签中指定delphi版本总是一个好主意。我不知道确切的版本,但它是从2006年开始使用的非常旧的delphi版本。所以我需要找到简单的替代方法。因此,对于第一个问题,我想到了“查找找到的文本的右侧”,如果没有任何内容,因为它是(字符串Kenneth的)结尾,那么您知道搜索的“texthaha”位于字符串的结尾。LastDelimiter测试您提供的分隔符中的每个字符,而不是询问什么。在您发布的链接中:“
分隔符
是一个字符串,其中每个字符都是有效的分隔符。”@SertacAkyuz感谢您的更正,您是对的。类似的方法是使用TStringHelper在SysUtils中声明的iin,并为已知函数编写Kenneth.EndsWith('texthah'),复制是一个更好的测试,因为任何模式都可以在一个字符串中多次找到。第一个问题非常棒
如果Pos(Sub,S)=Length(S)-Length(Sub)+1,那么
。。。很好地找到它是否在字符串的末尾(尽管我仍然试图理解它背后的逻辑lol)。对于第二个问题,我想MatchesMask命令不能使用,因为使用的Delphi版本可能太旧了,它是从2006年开始的,所以如果可能的话,我必须找到一个解决方法,因为MatchesMaskMatchesMask是一个相当旧的函数。您是否在<代码>中使用<代码>掩码< /代码>使用< /代码>?还考虑“Sytac Akuz”关于子串可能发生的多次事件的注释-因此,我将代码更改为<代码> POSEX 
if Copy(S, NPos, Length(Sub)) = Sub ...
 if MatchesMask(Kenneth, '*bcsome1*3text*')...