- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
测试时StrUtils.SearchBuf使用[soWholeWord,soDown]
选项,出现了一些意想不到的结果。
program Project1;
Uses
SysUtils,StrUtils;
function WordFound(aString,searchString: String): Boolean;
begin
Result := SearchBuf(PChar(aString),Length(aString), 0, 0, searchString,
[soWholeWord,soDown]) <> nil;
end;
Procedure Test(aString,searchString: String);
begin
WriteLn('"',searchString,'" in "',aString,'"',#9,' : ',
WordFound(aString,searchString));
end;
begin
Test('Delphi','Delphi'); // True
Test('Delphi ','Delphi'); // True
Test(' Delphi','Delphi'); // False
Test(' Delphi ','Delphi'); // False
ReadLn;
end.
为什么'Delphi'
和'Delphi'
不被视为一个完整的单词?
反向搜索怎么样?
function WordFoundRev(aString,searchString: String): Boolean;
begin
Result := SearchBuf(PChar(aString),Length(aString),Length(aString)-1,0,searchString,
[soWholeWord]) <> nil;
end;
Procedure TestRev(aString,searchString: String);
begin
WriteLn('"',searchString,'" in "',aString,'"',#9,' : ',
WordFoundRev(aString,searchString));
end;
begin
TestRev('Delphi','Delphi'); // False
TestRev('Delphi ','Delphi'); // True
TestRev(' Delphi','Delphi'); // False
TestRev(' Delphi ','Delphi'); // True
ReadLn;
end.
我根本不明白这一点。除了该功能有错误之外。
XE7、XE6 和 XE 中的结果相同。
<小时/>更新
最佳答案
对我来说这看起来像是一个错误。这是执行搜索的代码:
while SearchCount > 0 do
begin
if (soWholeWord in Options) and (Result <> @Buf[SelStart]) then
if not FindNextWordStart(Result) then Break;
I := 0;
while (CharMap[(Result[I])] = (SearchString[I+1])) do
begin
Inc(I);
if I >= Length(SearchString) then
begin
if (not (soWholeWord in Options)) or
(SearchCount = 0) or
((Byte(Result[I])) in WordDelimiters) then
Exit;
Break;
end;
end;
Inc(Result, Direction);
Dec(SearchCount);
end;
每次循环 while
循环时,我们都会检查 soWholeWord
是否在选项中,然后前进到下一个单词的开头。但我们只有在以下情况下才会这样做
Result <> @Buf[SelStart]
现在,Result
是缓冲区中的当前指针,是匹配的候选者。因此,此测试检查我们是否位于正在搜索的字符串的开头。
此测试的意思是,如果搜索的字符串以非字母数字文本开头,我们无法前进到第一个单词的开头。
现在,您可能决定删除以下测试
Result <> @Buf[SelStart]
但是如果您这样做,您会发现您不再匹配位于字符串开头的单词。所以你只会以不同的方式失败。处理这个问题的正确方法是确保如果我们位于字符串的开头并且其中的文本是字母数字,则 FindNextWordStart
不会前进。
我的猜测是原作者写的代码是这样的:
if (soWholeWord in Options) then
if not FindNextWordStart(Result) then Break;
然后他们发现字符串开头的单词不匹配,并将代码更改为:
if (soWholeWord in Options) and (Result <> @Buf[SelStart]) then
if not FindNextWordStart(Result) then Break;
没有人测试如果字符串以非字母数字文本开头会发生什么。
这样的事情似乎可以完成工作:
if (soWholeWord in Options) then
if (Result <> @Buf[SelStart]) or not Result^.IsLetterOrDigit then
if not FindNextWordStart(Result) then Break;
关于delphi - SearchBuf soWholeWord 意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25877986/
测试时StrUtils.SearchBuf使用[soWholeWord,soDown]选项,出现了一些意想不到的结果。 program Project1; Uses SysUtils,StrUti
我正在整理以前使用 FastStrings 的旧代码,并且我已经实现了我的旧例程“PosAnyCase”,它应该像“Pos”一样运行。 (我希望 SearchBuf 比在两个字符串上调用 UpperC
我是一名优秀的程序员,十分优秀!