模式匹配

字符串匹配算法——利用有限自动机进行匹配

前提是你 提交于 2019-12-22 15:29:31
  本文内容与《算法导论》中字符串匹配章节相关并部分摘录。   常用的字符串匹配算法有朴素字符串匹配算法,Rabin-Karp算法,利用有限自动机进行字符串匹配和KMP算法等。前面两种比较简单,重点是后面两种。 利用有限自动机进行字符串匹配   假设要对文本字符串T进行扫描,找出模式P的所有出现位置。这个方法可以通过一些办法先对模式P进行预处理,然后只需要对T的每个文本字符检查一次,并且检查每个文本字符所用时间为常数,所以在预处理建好自动机之后进行匹配所需时间只是Θ(n)。   假设文本长度为n,模式长度为m,则自动机将会有0,1,...,m这么多种状态,并且初始状态为0。先抛开自动机是怎样计算出来的细节,只关注自动机的作用。在从文本从左到右扫描时,对于每一个字符a,根据自动机当前的状态还有a的值可以找出自动机的下一个状态,这样一直扫描下去,并且一定自动机状态值变为m的时候我们就可以认为成功进行了一次匹配。先看下面简单的例子: 假设现在文本和模式只有三种字符a,b,c,已经文本T为"abababaca",模式P为"ababaca",根据模式P建立自动机如下图(b)(先不管实现细节):   (a)图为一些状态转化细节 如图(c),对照自动机转换图(b),一个个的扫描文本字符,扫描前状态值初始化为0,这样在i = 9的时候状态值刚好变成7 = m,所以完成一个匹配。  

rsync简明手册

拜拜、爱过 提交于 2019-12-21 18:10:27
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> rsync简明手册 !rsync同步模式 sync在进行同步或备份时,使用远程shell,或TCP连接远程daemon,有两种途经连接远程主机。 shell模式,不需要使用配置文件,也不需要启动远端rsync。远程传输时一般使用ssh作为传输工具。 daemon模式,但必须在一台机器上启动rsync。 !rsync命令调用格式 本地文件同步: rsync [OPTION...] SRC... [DEST] 示例: rsync -a /home/back1 /home/back2 基于远程shell同步: 拉取: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 推送: rsync [OPTION...] SRC... [USER@]HOST:DEST 基于rsync daemon同步: 拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 推送: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@

mysql 正则表达式

孤街醉人 提交于 2019-12-19 23:53:37
SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。在 MySQL中,SQL的模式默认是忽略大小写的。下面给出一些例子。注意使用SQL模 式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。 1.要想找出以“b”开头的id: select * from userinfo where userid like 'b%'; 2.要想找出以“b”结尾的id select * from userinfo where userid like '%b'; 3.要想找出包含“b”的id: select * from userinfo where userid like '%b%'; 4.要想找出正好包含5个字符的名字,使用“_”模式字符: select * from userinfo where userid like '_____'; 由MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。 扩展正则表达式的一些字符是: · ‘.’匹配任何单个的字符。 · 字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“

【剑指offer】正则表达式 -- Java 实现

ぐ巨炮叔叔 提交于 2019-12-19 10:01:58
题目描述 请实现一个函数用来匹配包括’.‘和’ ‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’ '表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab ac a"匹配,但是与"aa.a"和"ab*a"均不匹配 思路: 当模式中的第二个字符不是“*”时: 1、如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串和模式都后移一个字符,然后匹配剩余的。 2、如果 字符串第一个字符和模式中的第一个字符相不匹配,直接返回false。 而当模式中的第二个字符是“ ”时: 如果字符串第一个字符跟模式第一个字符不匹配,则模式后移2个字符,继续匹配。如果字符串第一个字符跟模式第一个字符匹配,可以有3种匹配方式: 1、模式后移2字符,相当于x 被忽略; 2、字符串后移1字符,模式后移2字符; 3、字符串后移1字符,模式不变,即继续匹配字符下一位,因为*可以匹配多位; 这里需要注意的是:Java里,要时刻检验数组是否越界。 public class Solution18 { public boolean match ( char [ ] str , char [ ] pattern ) { if ( str == null || pattern == null ) { return false ; }

sed或者awk命名模式匹配

柔情痞子 提交于 2019-12-18 23:37:13
背景 需要从一个文件中逐行的数据中提取出符合要求的子串,比如提取其中tagA*****tagB之间的字符 基于sed方式的子串提取 cat my.log | sed 's/\(.*\)tagA\(.*\)tagB\(.*\)/\2/g' 1 可以搭配grep先进行一次行过滤,在之后,再进行一次的子串提取: s: 表示替换命令 (.*)tagA : 表示tagA前的内容 tagA(.*)tagB:表示tagA和tagB之间的内容 tagB(.*):表示tagB后的内容 \2: 表示第二对括号里面的内容 括号里的表达式匹配的内容,可以用\1,\2等进行引用,第n个括号对内的内容,就用\n引用。 这个命令的意思是: 用\2代表的第二个括号的内容(即tagA好tagB之间的内容)去替换整个字符串,这样就得到了我们所需要的子字符串了。 grep 'id=myid' my.log | sed 's/\(.*\)tagA\(.*\)tagB\(.*\)/\2/g' 1 方案2: 采用awk和match的方案:通过match匹配出tagA的位置和tagB的位置,分别即为start1和start2,再通过substr进行字符串的截取,从而实现预期子串的提取。代码如下: cat my.log | awk '{start1=match($0,/GET/);start2=match($0,/HTTP/)

JS引用类型总结

情到浓时终转凉″ 提交于 2019-12-18 15:10:27
Object 类型 创建Object实例的方式: var person = new Object(); var person = { name : 'Mike', age : 23 } //属性名可以使用字符串如 'age': 23 Array 类型 创建数组的基本方式: 使用Array构造函数 (new可省略) var ar = new Array() var ar = new Array(3) //给定长度为3 var ar = new Array('red', 'yellow', 'green') 数组字面量表示法 var ar = ['red', 'yellow', 'green'] var ar = [] var ar = [ , , , , ] //错误示范,会创建一个包含4或5项的数组,每一项是undefined length属性: length属性不只是可读的,通过设置length属性可以从数组的末尾移除项或向数组中添加新项,数组最多可包含4294967295个项。 检测数组: value instanceof Array //假设只有一个全局环境 Array.isArray(value) //低版本浏览器尚未实现该方法 Object.prototype.toString.call(array) == '[object Array]' 转换方法: ar

awk 用法(使用入门)

浪尽此生 提交于 2019-12-18 09:07:15
awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符,默认为一个空格 RS 输入记录分隔符 NF 当前记录里域个数 NR 到目前为止记录数 OFS 输出域分隔符 ORS 输出记录分隔符 1、awk '/101/' file 显示文件file中包含101的匹配行。 awk '/101/,/105/' file awk '$1 == 5' file awk '$1 == "CT"' file 注意必须带双引号 awk '$1 * $2 >100 ' file awk '$2 >5 && $2<=15' file 2、awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。 awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。 awk '/101/ {print $1$2}' file awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。 3、df | awk '$4>1000000 ' 通过管道符获得输入,如

正则匹配原理之——逆序环视深入

感情迁移 提交于 2019-12-17 12:23:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前几天在 CSDN 论坛遇到这样一个问题: var str="8912341253789"; 需要将这个字符串中的重复的数字给去掉,也就是结果 89123457 。 首先需要说明的是,这种需求并不适合用正则来实现,至少,正则不是最好的实现方式。 这个问题本身不是本文讨论的重点,本文所要讨论的,主要是由这一问题的解决方案而引出的另一个正则匹配原理问题。 先看一下针对这一问题本身给出的解决方案。 string str = "8912341253789" ; Regex reg = new Regex ( @"((\d)\d*?)\2" ); while (str != (str = reg.Replace(str, "$1" ))) { } richTextBox2.Text = str; /*-------- 输出 -------- 89123457 */ 基于此有朋友提出另一个疑问,为什么使用下面的正则没有效果 “ (?<=(?<value>\d).*?)\k<value> ” 由此也引出本文所要讨论的逆序环视更深入的一些细节,涉及到逆序环视的匹配原理和匹配过程。前面的两篇博客中虽然也有介绍,但还不够深入,参考 正则基础之 —— 环视 和 正则应用之 —— 逆序环视探索

Django中的路由系统:urls

杀马特。学长 韩版系。学妹 提交于 2019-12-16 20:41:49
Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。 URLconf配置: 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 注意: Django 2.0版本中的路由系统已经替换成下面的写法:-------》官方文档: https://docs.djangoproject.com/en/2.0/topics/http/urls/ from django.urls import path urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail

Shell编程—正则表达式

余生长醉 提交于 2019-12-15 20:58:48
1 什么是正则表达式 1.1 定义 正则表达式是你所定义的模式模板,Linux工具可以用它来过滤文本。Linux 工具(比如sed编辑器或gawk程序)能够在处理数据时使用正则表达式对数据进行模式匹配。 1.2 正则表达式的类型 正则表达式是通过正则表达式引擎实现的。正则表达式引擎是一套底层软件,负责解释正则表达式模式并使用这些模式进行文本匹配。 在Linux中,有两种流行的正则表达式引擎: POSIX基础正则表达式(basic regular expression,BRE)引擎 POSIX扩展正则表达式(extended regular expression,ERE)引擎 2 定义 BRE 模式 2.1 纯文本 $ echo "This is a test" | sed -n '/test/p' This is a test $ echo "This is a test" | sed -n '/trial/p' $ $ echo "This is a test" | gawk '/test/{print $0}' This is a test $ echo "This is a test" | gawk '/trial/{print $0}' $ 第一个模式定义了一个单词test。sed编辑器和gawk程序脚本用它们各自的print命令打印出匹配该正则表达式模式的所有行