增强字符串匹配 DFA

2023-12-11

给定一个字符串,我必须测试它是否以一组已知的后缀结尾。现在,由于后缀不是很小,文档中的每个单词都必须根据已知后缀列表进行检查。单词中的每个字符和后缀都是char32_t。由于天真的迭代匹配将是昂贵的。尽管大多数后缀不是子后缀或另一个后缀的前缀,但它们大多数都是由一小组字符构成的。大多数检查都会失败而不是成功。

所以我想建立一个DFA的后缀,以尽量减少错过的成本。我可以手动解析 unicode 代码点并使用以下命令创建 DFAboost-graph。但是有没有现有的图书馆可以为我构建它?

包含所有后缀的巨大正则表达式是否会比 DFA 便宜,因为正则表达式搜索也以类似的方式构建 DFA 进行匹配?但我想知道当有命中时匹配的是哪个后缀。在正则表达式的情况下,我需要执行另一个线性搜索才能得到它(我无法标记正则表达式的内部 DFA 的顶点)。我还需要unicode正则表达式。只需将所有后缀加上|我猜会和线性搜索一样昂贵。我想我需要检查常见字符并使用lookahed和lookbacks相应地创建正则表达式。我手动构建DFA不也需要面对同样的困难吗?

我在用utf-32用于随机访问。不过,如果我可以轻松解决的话,切换到 utf-8 不是问题。我将从右到左反转字符串和模式。


你考虑过灵性吗?当然,您没有指定如何在上下文中检测后缀(您是否需要在末尾添加它们,您是否需要在其前面添加一些语法等),但是您可以执行以下操作:

    x3::symbols<Char> sym;
    sym += "foo", "bar", "qux";

它构建了一个 Trie,非常有效。它可以解析任何类型的输入迭代器(如果您愿意的话,包括流)。只需添加一些针对上下文要求的魔法约束,例如输入结束:

bool has_suffix(string_view sv) {
    return parse(sv.cbegin(), sv.cend(), x3::seek[suffix >> x3::eoi]);
}

如果您甚至希望返回字符串的文本值,只需执行以下操作:

string_view get_suffix(string_view sv) {
    boost::iterator_range<string_view::const_iterator> output;
    parse(sv.cbegin(), sv.cend(), x3::seek[x3::raw[suffix >> x3::eoi]], output);
    return {output.begin(), output.size()};
}

Spirit 为您提供了很大的自由来围绕智能,动态添加/删除符号,例如使用no_case与 Trie 等

完整演示

使用 X3 (c++14)

Live On Coliru

#include <boost/spirit/home/x3.hpp>
#include <string_view>
#include <cstdint>

namespace Demo {
    using Char = char32_t;
    using string_view = std::basic_string_view<Char>;

    namespace x3 = boost::spirit::x3;

    static auto const suffix = [] {
        x3::symbols<Char> sym;
        sym += "foo", "bar", "qux";

        return sym; // x3::no_case[sym];
    }();

    bool has_suffix(string_view sv) {
        return parse(sv.cbegin(), sv.cend(), x3::seek[suffix >> x3::eoi]);
    }

    string_view get_suffix(string_view sv) {
        boost::iterator_range<string_view::const_iterator> output;
        parse(sv.cbegin(), sv.cend(), x3::seek[x3::raw[suffix >> x3::eoi]], output);
        return {output.begin(), output.size()};
    }
}

#include <iostream>
#include <iomanip>

int main() {
    using namespace Demo;

    auto widen = [](string_view sv) { return std::wstring(sv.begin(), sv.end()); };
    std::wcout << std::boolalpha;

    for (string_view testcase : { U"nope", U"lolbar you betqux" }) {
        std::wcout 
            << widen(testcase) 
            << L" -> " << has_suffix(testcase)
            << L" (" << widen(get_suffix(testcase))
            << L")\n";
    }
}

Prints

nope -> false ()
lolbar you betqux -> true (qux)

灵气版

A literal port: Live On Coliru

A C++11 only version: Live On Coliru

And a C++03 version for the really retro programming experience: Live On Coliru

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

增强字符串匹配 DFA 的相关文章

  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • C++ 模板参数数量错误(2,应该是 1)

    我使用 C 并行快速排序程序进行了测试 如下所示 首先使用列表作为容器 然后我转移到通用容器类型 但它报告了标题错误 可以帮忙解决这个问题吗 include
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • 从数据库配置中的连接字符串中删除 SSIS 密码

    我有一个 SSIS 包 它使用 SQL 服务器中的 SSIS 配置表来检索 OLE DB 连接管理器的连接字符串属性 问题是我还需要相同的连接字符串来调用使用实体框架的程序集 我尝试访问连接管理器连接字符串属性 但 SSIS 总是删除密码
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720

随机推荐

  • 用户注册时自动创建个人资料 (Laravel 5)

    我正在尝试为我的注册用户创建一个个人资料页面 在此页面上 将显示身份验证 用户数据 姓名 电子邮件 还会显示额外的个人资料信息 城市 国家 地区 电话号码等 我已经建立了一对一的关系 但我遇到了一个问题 创建用户后 我想自动为该特定用户创建
  • Apache websocket 重定向到 Tomcat:mod_proxy 和 mod_proxy_wstunnel

    我正在尝试使用 mod proxy 和 mod proxy wstunnel 模块将流量从 Apache 重定向到 Tomcat HTTP 流量重定向没有问题 但我无法使用迄今为止尝试过的任何配置成功重定向 websocket 流量 我正在
  • 从 Python 调用并执行 r 脚本

    我正在尝试使用此 Python 脚本来调用 r 脚本并运行它 r 脚本是 dbc2csv r 其代码位于 Python 块下方 我设法调用 r 脚本并打开 R studio 但代码没有像我希望的那样自动运行 我的感觉是有什么问题subpro
  • 滚动位置时显示 Div

    首先我想参考这个网站 http annasafroncik it 我喜欢动画进入视野的方式 在 jquery 中创建类似的函数很难吗 有没有什么插件可以实现这样的效果 希望有人能帮助我 基本上 您想要为每个要隐藏的元素添加一个 hideme
  • 有没有办法获得“numpy.linalg.svd()”代码

    由于 numpy linalg svd 是一个预定义函数 我没有找到它的内部代码 from scipy import linalg u s v np linalg svd b full matrices True import inspec
  • SetTimeout 递归函数(Javascript)超出最大调用堆栈大小[重复]

    这个问题在这里已经有答案了 我有一个递归 SetTimeout 函数 可以在加载过滤器后单击页面上的过滤器 它们是通过 Ajax 加载的 因此在页面加载时无法立即使用 scope clickFilter function var filte
  • 核心数据:提取是否必须访问持久存储?

    假设我这样做 NSManagedObjectContext context a managed object context NSString entityName an entity name NSFetchRequest request
  • 循环 UIScrollView 但继续减速

    我已经设置了一个无限滚动视图 当它达到 0 内容偏移量时 我将其设置为最大内容偏移量 反之亦然 i e scrollView setContentOffset CGPointMake 0 0 animated NO 这是可行的 但它会阻止
  • session.php 中 laravel 生命周期配置变量的最大可能值是多少

    默认情况下 laravel 会话会在两小时后过期 我知道这是为了安全起见 但我有一个网络应用程序 其中有一个移动应用程序 android webview 用户不断抱怨每次访问该应用程序时都需要登录 作为临时解决方案 我想知道如何将此变量设置
  • 从eclipse导出maven项目

    有没有办法从 eclipse 导出整个 Maven 项目 我不只是想要一个 jar 文件 我正在寻找一种方法 让其他人可以下载整个项目及其依赖项以及所有已经设置的内容 方式与我相同 只需复制项目文件夹并让其他人将其作为 现有 Eclipse
  • ThrowIfCancellationRequested 似乎没有抛出任何异常

    我有以下代码 CancellationTokenSource cts new CancellationTokenSource ParallelOptions po new ParallelOptions po CancellationTok
  • 使用 PHP 变量从 MySQL 表中删除条目

    我很确定这个问题已经被问过很多次了 我已经在网上搜索过 但仍然找不到这个问题的解决方案 这是代码 我知道它不是注入证明 显示表中的所有条目 div div
  • 将整数四舍五入到最接近的 10

    我正在尝试在 python 中对整数进行舍入 我查看了内置的 round 函数 但似乎 rounds 是浮动的 我的目标是将整数四舍五入到最接近的 10 倍数 即 5 gt 10 4 gt 0 95 gt 100 等 5 及以上应向上舍入
  • 获取 Photos.app 中的图像数量?

    我知道可以使用 ALAssetsLibrary 获取 Photos app 中的图像 但如何获取 Photos app 中的照片总数 我几乎正在尝试检查照片的数量 因为我正在使用此问题的代码获取 Photos app 中的最后一张图像 从
  • 如何在 WinUI 3 应用程序中显示 Bitmap 对象

    我想显示 QRCoder 库生成的二维码 https github com codebude QRCoder 在我的 WinUI 3 桌面应用程序中 从 QRCoder 我得到System Drawing Bitmap object QRC
  • Mongoose $lookup 其中 localField 是foreignField中ObjectId的字符串

    我想要执行 lookup 其中 localField 是 ObjectId 的字符串表示形式 而外部字段是实际的 ObjectId 如果 items 是 String 值但 id 是 ObjectId 您知道 MongoDB 3 2 是否可
  • 销毁或删除 Backbone.js 中的视图

    我目前正在尝试为视图实现销毁 删除方法 但我无法获得适用于我所有视图的通用解决方案 我希望有一个事件附加到控制器 这样当新请求通过时它会破坏以前的视图then加载新的 有没有办法做到这一点 而不必为每个视图构建删除函数 我必须绝对确定视图不
  • Kinect - 使用深度将 (x, y) 像素坐标映射到“真实世界”坐标

    我正在开发一个项目 该项目使用 Kinect 和 OpenCV 将 fintertip 坐标导出到 Flash 以便在游戏和其他程序中使用 目前 我们的设置基于颜色工作 并将指尖点以 x y z 格式导出到 Flash 其中 x 和 y 的
  • 箱线图 两个框的一个 x 轴刻度线标签

    我正在尝试使用 R 中的 ggplot2 创建箱线图 下面是我的代码及其生成的图 我想改变它 而不是将 x 轴标记为 0 5mg 0 5mg 1mg 1mg 2mg 和 2mg 我只想在每组两个箱线图之间标记 0 5mg 1mg 和 2mg
  • 增强字符串匹配 DFA

    给定一个字符串 我必须测试它是否以一组已知的后缀结尾 现在 由于后缀不是很小 文档中的每个单词都必须根据已知后缀列表进行检查 单词中的每个字符和后缀都是char32 t 由于天真的迭代匹配将是昂贵的 尽管大多数后缀不是子后缀或另一个后缀的前