下面的代码基于NFA算法实现了在多段字符串中匹配正则表达式,对比NFA算法可以看到它将pc由局部变量提升为类成员,以保存中间匹配状态,另外在匹配成功后将pc恢复到null状态。实际使用中,此类还应该增加一个"reset"方法,将pc值置为null,以便用户可以显式要求重新开始匹配。

public class MultiSegmentNFA {
private final Digraph G; // digraph of epsilon transitions
private final String regexp; // regular expression
private final int M; // number of characters in regular expression
private Bag pc = null;
public MultiSegmentNFA(String regexp) {
... // same as NFA
}
public boolean recognizes(String target) {
if (pc == null) {
DirectedDFS dfs = new DirectedDFS(G, 0);
pc = new Bag();
for (int v = 0; v < G.V(); v++)
if (dfs.marked(v))
pc.add(v);
}
for (int i = 0; i < target.length(); i++) {
Bag match = new Bag();
for (int v : pc) {
if (v == M)
continue;
if ((regexp.charAt(v) == target.charAt(i))
|| regexp.charAt(v) == '.')
match.add(v + 1);
}
DirectedDFS dfs = new DirectedDFS(G, match);
pc = new Bag();
for (int v = 0; v < G.V(); v++)
if (dfs.marked(v))
pc.add(v);
if (pc.size() == 0)
return false;
}
for (int v : pc)
if (v == M) {

 pc = null;
return true; }

return false;
}

public static void main(String[] args) {
LinkedList msgs = new LinkedList();
msgs.offer("welcome lonely logoout");
msgs.offer("to flog");
msgs.offer("into a fog");
String token = "outto"; // 这个目标由第1和第2个字符串拼接而成
String pat = "(." + token + ".)";
MultiSegmentNFA mnfa = new MultiSegmentNFA(pat);
String target = msgs.poll();
while (target != null) {
if (mnfa.recognizes(target)) {
break;
}
target = msgs.poll();
}
if (target == null) {
System.out.println("cannot find " + token + " in msgs.");
} else {
System.out.println("find pat in <" + target + ">");
}
}
}

Note: Java的Pattern类使用的就是基于NFA的搜索算法,见JDK 6文档java.util.regex.Pattern的"Comparison to Perl 5"一节。

能够进行多段文本匹配的NFA改良算法的更多相关文章

  1. 如何将一段文本编译成C#内存程序的过程

    string code = null; // 1. 生成要编译的代码.(示例为了简单直接从程序集内的资源中读取) Stream stram = typeof(CodeDOM).Assembly .Ge ...

  2. php 两段文本对比,不同的文字显示高亮

    php 两段文本对比,不同的文字显示高亮[下面这个只能区分错误后面的..]   <?php $str1 ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwgg ...

  3. python_计算一段文本各个字符的出现个数

    >题目要求 任意给定一段文本,求出每个字符出现的个数,并且打印出来 >程序实现 import pprint str01 = "重庆市,简称巴和渝,别称山城.渝都.雾都.桥都,中华 ...

  4. mysql 两张表字段模糊匹配--字符串拼接函数

    concat(A,B,C,...)  拼接字符串 例如concat('123','***','345')  =>123***345 SELECT concat( substr(t1.CODE, ...

  5. text matching(文本匹配) 相关资料总结

    最近工作上需要做句子语义去重相关的工作,本质上这是属于NLP中text matching(文本匹配)相关的内容.因此我花了一些时间整理了一些关于这个方向的资料,整理如下(也许会持续更新): BiMPM ...

  6. [Alg] 文本匹配-单模匹配与多模匹配

    实际场景: 网站的用户发了一些帖子S1, S2,...,网站就要审核一下这些帖子里有没有敏感词. 1. 如果网站想查一下帖子里有没有一个敏感词P,这个文本匹配要怎么做更快? 2. 如果网站想查一下帖子 ...

  7. [Alg] 文本匹配-单模匹配-KMP

    1. 暴力求解 如下图所示.蓝色的小三角表示和sequence比较时的开始字符,绿色小三角表示失败后模式串比对的开始字符,红色框表示当前比较的字符对. 当和模式串发生不匹配时,蓝色小三角后移一位,绿色 ...

  8. 跨模态语义关联对齐检索-图像文本匹配(Image-Text Matching)

    论文介绍:Negative-Aware Attention Framework for Image-Text Matching (基于负感知注意力的图文匹配,CVPR2022) 代码主页:https: ...

  9. 转:Xshell显示找不到匹配的outgoing encryption算法怎么办

    原文出处:http://www.xshellcn.com/xsh_column/suanfa-bpp.html 由用户反应在使用xshell和xftp连接debian 7时出现找不到匹配的outgoi ...

随机推荐

  1. python之字典(dict)基础篇

    字典:dict 特点: 1>,可变容器模型,且可存储任意类型对象,字符串,列表,元组,集合均可: 2>,以key-value形式存在,每个键值 用冒号 : 分割,每个键值对之间用逗号 , ...

  2. Java运算中的类型转换

    类型转换 运算中,不同类型的数据先转化为同一类型,然后进行运算 public class Dome04 { public static void main(String[] args) { //int ...

  3. php安裝7.3版本

    CentOS 安装 EPEL 源: yum install epel-release 安装 REMI 源: CentOS 7: yum install http://rpms.remirepo.net ...

  4. 【保姆级】Python项目(Flask网页)部署到Docker的完整过程

    大家好,我是辰哥~ 前提:相信看到这篇文章的读者应该已经学会了Docker的安装以及Docker的基本使用,如果还不会的可以参考我之前的文章进行详细学习! 1.安装版:2300+字!在不同系统上安装D ...

  5. STP、生成树的算法

    STP.生成树的算法       一.STP        1)STP概述        2)交换网络环路的产生        3)STP简介        4)STP的工作原理        5)S ...

  6. 高性能内存图数据库RedisGraph(二)

    这篇文章主要介绍用一下RedisGraph的历史和现状. 2018年5月,Redis Labs发布了RedisGraph的预览/测试版.6个月后,在Redis Labs和开源社区的开发者们的共同努力下 ...

  7. 从代码生成说起,带你深入理解 mybatis generator 源码

    枯燥的任务 这一切都要从多年前说起. 那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表. 因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表 ...

  8. ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁

    前言 分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的. 使 ...

  9. 【剑指offer】05. 替换空格

    剑指 Offer 05. 替换空格 知识点:: 题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 输入:s = "We are happy.& ...

  10. vuejs第一集之:vuejs了解

    1,了解到前后端分离2,连接到vuejs3,搜集书籍: Vuejs前端开发基础与项目实战 (https://detail.tmall.com/item.htm?spm=a230r.1.14.107.6 ...