模式匹配

正则配合grep使用简介

醉酒当歌 提交于 2020-02-10 16:02:31
grep grep: Global search REgular expression and Print out the line 作用:文本搜索工具,根据用户指定的“模式”对目标文 本逐行进行匹配检查;打印匹配到的行 模式:由正则表达式字符及文本字符所编写的过滤条件 grep [OPTIONS] PATTERN [FILE...] grep root /etc/passwd grep "$USER" /etc/passwd grep '$USER' /etc/passwd grep `whoami` /etc/passwd grep命令选项 --color=auto: 对匹配到的文本着色显示 -v: 显示不被pattern匹配到的行 -i: 忽略字符大小写 -n:显示匹配的行号 # grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin -c: 统计匹配的行数 # grep -c root /etc/passwd 2 -o: 仅显示匹配到的字符串 grep -o root /etc/passwd root root root root -q: 静默模式,不输出任何信息 主要在脚本中使用,之查看匹配结果是否成功

关于KMP算法

有些话、适合烂在心里 提交于 2020-02-07 09:26:48
KMP 算法是非常经典的字符串匹配算法,而且有可能是最经典的一个。同时它也是非常典型的一种优化算法,它把原本暴力法 O( mn ) 的最坏复杂度降低到了 O( m+n )(虽然实际上暴力法的执行复杂度期望依然是线性的),其思想非常具有典型性和可借鉴性,值得好好学习。 1 基本思想 KMP 算法的基本思想是,借助一个预先计算好的数组 pi ,在匹配了一定数量的模式的情况下,遇到不匹配的字符时,不像暴力法那样将待匹配的文本下标从上一次匹配的地方向后移动一个位置,并将已匹配的模式个数清零,而是利用已经匹配部分的信息,迅速跳过那些不可能匹配成功的文本开头,减少了暴力法中一些不必要的盲目搜索。 比如,对于模式 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 a b a b a b c a b c a b c d b c d b c d 如果从文本中的某一个字符开始,匹配到6号字符c时,出现了不匹配,此时已经匹配了6个字符。如果再从文本中下一个字符b开始,从模式的第0号字符开始继续尝试,就是暴力法的思想。而 KMP 算法比暴力法先进的地方就在于,它利用 模式 已匹配部分的信息,跳过那些已遍历的文本中不可能匹配的开头,直接进入有可能会产生匹配的文本开头,并更新相应的已匹配字符长度。比如,匹配到6号字符时,出现不匹配

kmp算法的自我理解

萝らか妹 提交于 2020-02-07 09:26:31
序:很久没做算法题了,为了回顾一下自己的算法知识,方便下次理解,特地记录自己一些对一些算法的理解。 约定: 模式串 ababcd 文本串 abababcd 用 M 代表模式串, W 代表文本串 kmp算法包括两个部分,1.计算模式串的next数组。 2.kmp主程序,模式串与主串(即文本串)的匹配。 Next数组 next[i]表示字符串第i个字符可匹配的最近的下标(挺拗口的),作用是记录已经遍历过的字符内的信息。 先看计算next数组的程序, private static int[] getNext(char[] str) { int length = str.length; int[] next = new int[length]; next[0] = -1; int k = -1; for(int i=1; i<length; i++) { while(k > -1 && str[i] != str[k+1]){ k = next[k]; } if(str[i] == str[k+1]) { k++; } next[i] = k; } return next; } 字母下方即是模式串的next数组 a b a b c d -1 -1 0 1 -1 -1 从结果来看,我们可以看到next[3] = 1,含义是它的可匹配的最近的下标是1。其实从这时候来看还是觉得没什么作用

正则表达式规则

末鹿安然 提交于 2020-02-07 05:00:12
正则表达式使用详解   简介   简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下:   测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。   替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。   根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。   基本语法   在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。   正则表达式的形式一般如下:   /love/  其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。   较为常用的元字符包括: “+”, “*”,以及 “?”。   “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。   “*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。   “?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。

. 正则表达式规则

我与影子孤独终老i 提交于 2020-02-07 03:57:11
http://blog.csdn.net/zaifendou/article/details/5746988 1. 正则表达式规则 1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 举例1:表达式 "c",在匹配字符串 "abcde" 时 ,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同) 举例2:表达式 "bcd",在匹配字符串 "abcde" 时 ,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。 1.2 简单的转义字符 一些不便书写的字符,采用在前面加 "/" 的方法。这些字符其实我们都已经熟知了。 表达式 可匹配 /r, /n 代表回车和换行符 /t 制表符 // 代表 "/" 本身 还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "/" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "/^" 和 "/$"。 表达式 可匹配 /^ 匹配 ^ 符号本身 /$ 匹配 $ 符号本身 /. 匹配小数点(.)本身 这些转义字符的匹配方法与 "普通字符"

C#正则表达式语法规则详解

拈花ヽ惹草 提交于 2020-02-07 03:49:41
正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter) 字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde"的字符串。 元字符则更加灵活运用通用的表达式匹配所有符合此表达式规律的字符串。 C#正则表达式语法一、 匹配单个字符 []——从中选择一个字符匹配 中间支持的类型:单词字符([ae])、非单词字符([!?,;@#$*])、字母范围([A-Z])、数字范围([0]) eg.正则表达式[ae]ffect 可匹配字符串 affect,effect (此例中"[ae]"为元字符,"ffect"为字母文本) 注意: 1.要在字符类中匹配连字符,那么把连字符号作为第一个字符列出即可。 2.可以在单个正则表达式中包含多个字符类。 eg.[01][0-9]:[0-5][0-9][ap]m可以用来匹配如12:59pm格式的所有时间 ^——排除某些字符(在[]中表此意,还可表示字符串的开头) eg.正则表达式m[^a]t 可匹配字符串 不可匹配字符串 met,mit,m&t……mat C#正则表达式语法二、 匹配特殊字符 可以使用的特殊字符: \t——匹配制表符 \r——匹配硬回车符 \f——匹配换页符 \n——匹配换行符 描述表示字符类的元字符: .——匹配任何除了\n以外的字符(或者在单行模式中的任何字符) \w——匹配任何单词字符

re模块

倾然丶 夕夏残阳落幕 提交于 2020-02-07 00:23:54
正则表达式 ​ 一组特殊符号组成的表达式,用于描述某种规则。该应用场景生活中随处可见。 ​ 例如:让有志青年过上体面的生活,这里面就由规则,即有志青年。 正则表达式的作用,以及使用场景 ​ 1.用于从字符串中匹配满足某种规则的内容,多数用于爬虫应用程序 ​ 2.判断字符串串内容是否满足某种规则,多用于严重用户输入。例如密码是否规范,手机号是否正确等 学习重点 ​ 正则是一堆特殊符号组成的,我们主要学习的就是这些特殊符号 元字符 描述 \ 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配\n。“\n”匹配换行符。序列“\”匹配“”而“(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。 ^ 匹配输入字行首。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入行尾。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式任意次。例如,zo 能匹配“z”,也能匹配“zo”以及“zoo”。 等价于{0,}。 + 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 { n } n 是一个非负整数。匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”

正则表达式学习笔记

笑着哭i 提交于 2020-02-06 23:55:38
1. 引言 以前我们用 grep 在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义。其实 grep 还可以找出 符合某个模式(Pattern) 的一类字符串。例如找出所有符合 xxxxx@xxxx.xxx 模式的字符串(也就是email地址),要求x字符可以是字母、数字、下划线、小数点或减号,email地址的每一部分可以有一个或多个x字符,例如 abc.d@ef.com 、 1_2@987-6.54 ,当然符合这个模式的不全是合法的email地址,但至少可以做一次初步筛选,筛掉 a.b 、 c@d 等肯定不是email地址的字符串。再比如,找出所有符合 yyy.yyy.yyy.yyy 模式的字符串(也就是IP地址),要求y是0-9的数字,IP地址的每一部分可以有1-3个y字符。 如果要用 grep 查找一个模式,如何表示这个模式,这一类字符串,而不是一个特定的字符串呢?从这两个简单的例子可以看出,要表示一个模式至少应该包含以下信息: 字符类(Character Class) :如上例的x和y,它们在模式中表示一个字符,但是取值范围是一类字符中的任意一个。 数量限定符(Quantifier) : 邮件地址的每一部分可以有 一个或多个x字符,IP地址的每一部分可以有 1-3个y字符 各种字符类以及普通字符之间的位置关系:例如邮件地址分三部分,用普通字符 @ 和 . 隔开

RabbitMQ 一二事(5) - 通配符模式应用

Deadly 提交于 2020-02-06 02:12:45
之前的路由模式是通过key相等来匹配 而通配符,顾名思义,符合条件,则进行消息匹配发送 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。 符号 “#” 匹配一个或多个词,符号 “*” 匹配不多不少一个词。 因此 “audit.#” 能够匹配到 “audit.irs.corporate” ,但是 “audit.*” 只会匹配到 “audit.irs” 如图: 官网截图: 代码示例: 服务方 接收方1 接受方2 路由模式也是通配符模式的一种 在生产环境中,以通配符模式用的较多 当然简单应用的话路由模式也够了 来源: https://www.cnblogs.com/leechenxiang/p/5525388.html

扩展KMP算法的详细理解+例题--hdu 2328

妖精的绣舞 提交于 2020-02-03 04:51:50
借鉴博客: https://blog.csdn.net/qq_40160605/article/details/80407554 扩展KMP的详细理解 扩展KMP求的是对于原串S1的每一个后缀子串与模式串S2的最长公共前缀。它有一个next[]数组和一个extend[]数组。 next[i]表示为模式串S2中以i为起点的后缀字符串和模式串S2的最长公共前缀长度. 其中,next[0]=l2; next[i]=max{ k|i<=i+k-1<l2 &&S2.substring(i,i+k-1) == S2.substring(0,k-1) } 其中str.substring(i, j)表示str从位置i到位置j的子串,如果i>j则,substring为空。 extend[i]表示为以字符串S1中以i为起点的后缀字符串和模式串S2的最长公共前缀长度. 下面我们先以一组样例来理解扩展KMP的过程 (1) 第一步,我们先对原串S1和模式串S2进行逐一匹配,直到发生不配对的情况。我们可以看到,S1[0]=S2[0],S1[1]=S2[1],S1[2]=S2[2],S1[3] ≠S2[3],此时匹配失败,第一步结束,我们得到S1[0,2]=S2[0,2],即extend[0]=3; (2) Extend[0]的计算如第一步所示,那么extend[1]的计算是否也要从原串S1的1位置