SearchBuf soWholeWord 意外输出

2023-11-27

测试时StrUtils.SearchBuf with [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.

Why are ' Delphi' and ' 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 的结果相同。


Update

QC127635 StrUtils.SearchBuf 因 [soWholeWord] 选项而失败


对我来说这看起来像是一个错误。这是执行搜索的代码:

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]

Now, 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SearchBuf soWholeWord 意外输出 的相关文章

  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • 使用 TStringList 的分隔符解析字符串,似乎也解析空格(Delphi)

    我有一个简单的字符串 由某个字符分隔 比如说逗号 我应该能够创建一个 TStringList 并将其分隔符设置为逗号 然后将 DelimitedText 设置为我想要解析的文本 并且应该自动解析它 问题是 当我查看输出时 它还包含空格作为分
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 从 Delphi VCL 样式获取特定字形

    我想从 VCL 样式获取特定的位图 并将其设置为按钮上的图像 它实际上是帮助问号 在位图样式编辑器中是来自表单的 btnHelp 图像 要从 VCL 样式获取视觉元素 字形 您必须使用GetElementDetails和TCustomSty
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • 如何在表单上绘制半透明图像?

    我想在 Delphi 窗体上绘制半透明图像 但由于某种原因它不起作用 Here is the original PNG border is semi transparent 我将图像加载到TImage object Image1 Trans
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • 使用 Delphi 读取 Excel 电子表格

    我需要使用 Delphi 2010 读取和写入 Excel 电子表格 没什么花哨的 只需读取和写入不同工作表上特定单元格和范围的值 需要在没有安装 Excel 的情况下工作并支持 Excel 2007 我看过的一些东西 我尝试过使用ADO
  • Delphi:现场记录应用程序错误

    使用 Delphi 7 我想知道是否有一个免费组件可以在我的应用程序在远程站点运行时收集诊断信息并帮助我调试错误报告 也许它会记录每个选择的菜单项 单击的控件 文本输入等 也许它只是在崩溃时转储堆栈 也许它还有其他作用 我不介意添加代码 例
  • 使用 Delphi 10.2.1 Tokyo 的模态 Android 对话框

    我有以下用于在 Android 上显示模式消息的 Delphi 代码 该代码在 10 1 Berlin 上运行良好 但在 Delphi 10 2 1 Tokyo 上停止运行 此过程现在会挂起 Android 应用程序 procedure c
  • Delphi + Synapse:如何检查我是否仍然连接

    我在用TTCPBlockSocket http synapse ararat cz doc help blcksock TTCPBlockSocket html对于 TCP IP 应用程序 问题是我无法确定连接何时丢失 GetLastErr
  • 在网格上拖动时拖动图像更改

    我正在 StartDrag 上创建自定义 DragObject 的实例 procedure TForm1 GridStartDrag Sender TObject var DragObject TDragObject begin DragO

随机推荐

  • HTTPS 与 Visual Studio 的内置 ASP.NET 开发服务器

    有没有办法通过 HTTPS 访问 Visual Studio 的内置 ASP NET 开发服务器 现在我们可以使用IIS Express在SSL中进行开发和测试 这是一篇完整的文章 解释如何使用 IIS Express 和 Visual S
  • 如何使用 C# sql server 将新行添加到现有表

    我需要写一个程序 该程序的一部分是写入 SQL 数据库 mdf 我在尝试向表中添加新行 称为 数据 时遇到了很多麻烦 这是代码 DataSet ds new DataSet System Data SqlClient SqlDataAdap
  • 如何通过添加数字来创建唯一的文件名?

    我想创建一个方法 它将文件名作为string or a FileInfo如果文件存在 则在文件名中添加一个递增的数字 但我无法完全理解如何以一种好的方式做到这一点 例如 如果我有这个 FileInfo var file new FileIn
  • jquery attr("onClick") - ie 和 ff

    使用 jquery 我想从 A 标签的 onClick 属性获取 javascript a href a 在火狐中 alert a attr onClick shows alert boo 在 IE 6 7 中 alert a attr o
  • 如何在javascript中解析具有两位小数的浮点数?

    我有以下代码 我希望如果price result 等于一个整数 比如说10 那么我想添加两位小数 所以 10 就是 10 点 或者如果它等于 10 6 则为 10 60 不知道该怎么做 price result parseFloat tes
  • python - 计算每个数字出现的次数

    我有一长串用逗号分隔的数字 我可以搜索并统计大多数数字 或更准确地说 2 位数字 出现的次数 如果我有一个像这样的数字序列 1 2 3 4 5 1 6 7 1 8 9 10 11 12 1 1 2我想数一下这个数字有多少次1看来我真的应该得
  • 使用 python 和 selenium 连接到 phantomJs webdriver 时遇到问题

    我正在尝试在使用 selenium 和 phantomjs webdriver 的 Linux 服务器上运行 python 脚本 但是 我不断收到以下错误消息 selenium common exceptions WebDriverExce
  • SwiperJS 样式不适用于 NextJS

    我已经安装了SwiperJS进入我的NextJS项目 我完全遵循了 Swiper 教程文档 但是当我尝试对类进行样式设计时出现问题 swiper swiper slide 样式不响应我的自定义样式 就我而言 我的滑块是一个组件 并且有一个名
  • 增加 iOS 5.x 中 UITextView 中表情符号字符的字体大小

    如果我有 UITextView 并将字体大小设置为 32 当我运行应用程序 在模拟器和设备上 时 我会看到一个大光标 并且我键入的文本就像我想象的那样出现 但如果我切换表情符号键盘 它们会显示很小 就像字体大小从未增加一样 我知道这些表情符
  • 从 Visual Studio 2015 构建时自动发布 Web 应用程序

    有没有什么方法可以在成功构建时使用预先创建的发布配置文件自动发布 Web 应用程序 我不想必须单击发布图标 需要在 Visual Studio 2015 上成功构建 Web 项目时发生这种情况 不使用宏 任何样品将不胜感激 拉米的解决方案有
  • 检查空手道的 2 个不同状态

    我有一个关于空手道框架的问题 我想知道我们是否可以检查空手道的 2 状态 例如 给定 url myUrl 当方法得到 然后状态 200 或 204 感谢您的帮助 Yes Then assert responseStatus 200 resp
  • C++:除了虚函数之外,还有哪些原因导致“未定义引用‘typeinfo for [class name]’”

    其中一些错误可以通过修改来解决 virtual void draw to virtual void draw 但是 除了虚拟函数之外 这些错误的其他原因可能是什么 出现以下错误可能是什么原因 tmp cciGEgp5 o rodata ZT
  • 标签、复选框和单选按钮

    我的网络应用程序使用如下例所示的表单 First Name Last Name Gender Male Female 我使用的标记类似于
  • 隐藏 Android 键盘按键预览

    我想要做的是仅隐藏显示您在使用软键盘时当前按下的键的弹出窗口 这可能吗 我正在创建自己的新键盘 不需要它们 据我所知 下图是实际的弹出键盘 您可以选择使用它来显示android popupKeyboard and android popup
  • 在javascript中获取DIV的宽度和高度

    我试图在用户更改时获取 div 宽度和高度 并将该数字提交到另一个页面 我似乎不知道如何获得宽度和高度
  • 如何在 Scala 中对可变长度的重复序列进行分组

    我有一个以某种模式重复的整数集合 val repeatingSequence List 1 2 3 1 2 3 4 1 2 1 2 3 4 5 当模式重复时 我想将该列表分段 在这种情况下 当序列返回到 1 时 val groupedByS
  • 使用 Kubernetes kubeadm 和 minikube 在虚拟机中创建节点

    我正在尝试使用同一台机器创建具有不同数量节点的 Kubernetes 集群 在这里 我想创建单独的虚拟机 并需要在这些虚拟机中创建节点 我目前正在探索 kubeadm 和 minikube 来完成这些任务 在探索的过程中 我有以下困惑 我需
  • 如何将一个元素移动到另一个元素中

    我想将一个 DIV 元素移动到另一个 DIV 元素中 例如 我想移动这个 包括所有孩子 div div 进入这个 div div 这样我就有了这个 div div div div 您可能想使用appendTo函数 添加到元素的末尾 sour
  • Express Node.js 不起作用

    我在 ubuntu 12 04 上安装了express 4以及node js npm和express generator 并使用以下命令创建了一个应用程序 express test hogan c less cd test npm inst
  • SearchBuf soWholeWord 意外输出

    测试时StrUtils SearchBuf with soWholeWord soDown 选项 出现了一些意想不到的结果 program Project1 Uses SysUtils StrUtils function WordFound