模式匹配

sed用法详解

社会主义新天地 提交于 2019-11-27 00:03:04
Sed 简介 sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。 sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。 sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。 Sed 命令格式 1 sed 命令行格式为: sed [选项] ‘ command ’ 输入文本 Sed 定位 Sed 命令在没有给定的位置时,默认会处理所有行; Sed 支持一下几种地址类型: 1 、 first~step 这两个单词的意思: first 指起始匹配行, step 指步长,例如: sed -n 2~5p 含义:从第二行开始匹配,隔 5 行匹配一次,即 2,7,12....... 。 2 、 $ 这个 $ 符表示匹配最后一行。 3 、 /REGEXP/ 这个是表示匹配正则那一行,通过 // 之间的正则来匹配。 4 、 \cREGEXPc 这个是表示匹配正则那一行,通过 \c 和 c 之间的正则来匹配 ,c 可以是任一字符 5 、 addr1 , add2 定址 addr1 , add2 决定用于对哪些行进行编辑。地址的形式可以是数字、正则表达式或二者的结合。如果没有指定地址, sed 将处理输入文件中的所有行。如果定址是一个数字

Rocket - tilelink - ErrorEvaluator

主宰稳场 提交于 2019-11-26 20:59:40
https://mp.weixin.qq.com/s/NkbW465NAmhDsETksd2M0g 介绍ErrorEvaluator的实现。 ​ ​ 1. 基本介绍 ErrorEvaluator 用于判断请求(Request)是否符合某种模式(Pattern)。 若符合,则下游节点针对这个请求的响应消息中应该报告错误。 2. RequestPattern ​ ​ 1) 测试方法: test: TLBundleA => Bool a. 输入参数: TLBundleA ,可以看出这个方法只能测试channel a的请求; b. 返回值: Bool ,返回测试结果,即是否满足模式; 2) 调用测试方法 根据RequestPattern的定义可以看出:测试方法是固定的,待测试的对象是变化的。需要测试某个请求时,直接把该请求传入RequestPattern对象的apply方法即可: ​ ​ 3) 测试方法实例:overlaps 判断请求中的地址是否与指定的AddressSet序列中的某一个重叠: ​ ​ 包含两个参数列表: a. pattern: Seq [AddressSet] :预先指定的一组AddressSet; b. a: TLBundleA :channel a输入的请求; 这里第一个参数列表命名为pattern并不合适,为了不与RequestPattern中的Pattern混淆

kmp算法

人盡茶涼 提交于 2019-11-26 17:00:15
————————————————————时光点燃了少年的梦想....... 1. abcdef 的前缀:  a,   ab,   abc,   abcd,   abcde   (abcdef 可不是前缀哦!) abcdef 的后缀:  f,   ef,   def,   cdef,     bcdef,  (abcdef可不是后缀哦!) abcdef 的 前缀后缀最长公共元素长度 为  0         (因为其前缀与后缀没有相同的!) ababa的前缀:    a,  ab,  aba,  abab,   ababa的后缀:    a,  ba,  aba,  baba, ababa的 相同前缀后缀的最大长度 为:  3 ascesubluffy 的 prefix:      a,  as,  asc,  asce,  asces,  ascesu,  ascesub,  ascesubl,  ascesublu,  ascesubluf,  ascesubluff, asecesubluffy 的postfix:   y,  fy,   ffy,    uffy,  luffy,   bluffy,  ubluffy,   subluffy,   esubluffy,   cesubluffy,  scesubluffy, 长度为 len 的字符串的前缀与后缀的个数为 2*

【转载】正则表达式

佐手、 提交于 2019-11-26 15:59:37
【转载】正则表达式 (本文是精简自张子阳先生的正则表达式一文,并做部分修改) 正则表达式总是在你的开发过程中如影随形,不管是进行表单验证,还是高亮显示搜索结果,又或者是进行URL地址映射,总是需要使用它们。几乎所有的语言都对它进行了不同程度的支持,由此,足见其在文本匹配这一领域中的地位。 什么是正则表达式? 正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本。 正则表达式是大小写敏感的,是顺序敏感的。 匹配固定单个字符 所有的单个大小写字母、数字,以及特殊字符,都是一个正则表达式,它们只能匹配单个字符,且这个字符与它本身相同。例如,在源字符串中搜索类似这样的表达式:m;这样将会匹配字符串中所有出现过的 m。 将多个固定单个字符进行组合,就构成了一个匹配固定字符串的表达式,例如:Jack。 匹配任意单个字符 符号 . 可以匹配任意单个字符。如,英文字母、数字、以及它本身。 例如:abc. ,将会匹配 abcX;如果是 .abc. 将会匹配 XabcX。 匹配字符组 有时候,符号 . 过于灵活了,它可以匹配几乎所有的单个字符。有的时候,我们只希望匹配有限个字符中的某一个。这个时候,可以使用字符组。 例如,Lov[ef] 表示匹配 Love 或者 Lovf 这两者。中括号是特殊标记,用以划定属于组内的字符的界限。 字符组虽然由多个字符构成

线性表-串:KMP模式匹配算法

妖精的绣舞 提交于 2019-11-26 14:59:22
一、简单模式匹配算法(略,逐字符比较即可) 二、KMP模式匹配算法 next数组:j为字符序号,从1开始。 (1)当j=1时,next=0; (2)当存在前缀=后缀情况,next=相同字符数+1; (3)当 前缀 != 后缀 且j != 1时,next=1。 如下: abcdex next=011111 abcabx next=011123 ababaaaba next=011234223 说明:0位置为情况1; 1、2位置为情况3; 3-5位置一直有前缀对称,所以一直累加; 6位置前缀不对称,j=next[ j ]找对称子串开始位置;如果没有继续j= next[ j ]直到 j = 0,next为0; 此处 i = 6, j = 4;第一次找: j = next[4] = 3, T[3] != T[6] ,没找到;第二次找: j= next[ 3 ] =1, T[2] == T[6], 找到累加 j+1 =2; 7位置同上; 8位置在7位置基础累加得到。 aaaaaaaab next=012345678 说明:0位置为情况1; 1位置为情况3; 2-8位置一直有前缀对称,所以一直累加。 代码如下: 1: void get_next( char T[], int * next) 2: { 3: int i = 1; 4: int j = 0; 5: 6: next[1] = 0;

正则性能调优

走远了吗. 提交于 2019-11-25 22:58:40
这篇文章主要是分享最近在开发中正则的学习心得体会。我们开发,一开始是采用python的正则库,后来为了适应Spring Cloud兼容Java所以正则也相应的修改成为了Java版本,经过测试,Java在匹配速度上相对慢了好多,平台一天需要处理一亿多条日志,但按照当时的处理速度,每天差不多就只能处理了2千多万条,这样的速度,实在扎心,提单申请扩容,那边的负责人说资源不足,好咯,将Java所使用的正则库替换成C++,C++够快了吧,不过,这个库是通过牺牲功能换取性能来实现的。 正则表达式的原理 理论模型是 有穷自动机 ,具体的实现为 正则引擎(Regex Engine) 分两类 确定型有穷自动机(Definite Finite Automata,DFA,其状态都是确定) 和 非确定型有穷自动机(Non-definite Finite Automate,NFA,其状态在某个时刻是不确定的) 。DFA和NFA是可以证明存在等价关系,不过这是两种不同的自动机。在这里,我才不会深入讨论它们的原理。简单地说,DFA 的时间复杂度是线性的。它更稳定,但功能有限。NFA 的时间复杂度相对不稳定。 根据正则表达式的不同,时间有时长,有时短。NFA 的优点是它的功能更强大,所以被 Java、.NET、Perl、Python、Ruby 和 PHP 用来处理正则表达式。 NFA 是怎样进行匹配的呢