模式匹配

正则表达式用法

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

javascript正则表达式使用详解

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

java正则表达式

旧城冷巷雨未停 提交于 2020-03-02 19:48:46
Java的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点) 1 英文句点符号:匹配单个任意字符。 eg: 表达式”t。o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。 2 方括号:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。 eg: 表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。 3 | 符号。相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。 eg: 表达式:t(a|b|c|dd)n 只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn 4 表示匹配次数的符号 {n, }表示至少N次。 eg: 表达式:[0—9]{ 3 } \— [0-9]{ 2 } \— [0-9]{ 3 } 的匹配格式为:999—99—999 因为“—”符号在正则表达式中有特殊的含义,它表示一个范围,所以在前面加转义字符“\”。 5 ^符号:表示否 ^符号被称为“否”符号,如果用在方括号内,“^“表示不想匹配的字符。 eg: 表达式:[^x] 第一个字符不能是x 6:圆括号,和空白符号 “\s”是空白符号,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。 ()是分组号,可以用ORO API提取处出值

sed详解

℡╲_俬逩灬. 提交于 2020-03-01 05:52:15
文章目录 语法 SED工作流程 选项 SCRIPS 模式空间命令 保持空间命令 sed使用实例 1、打印: p 命令 2、删除: d 命令 3、替换: s 命令 4、追加: a 命令 5、插入:i命令 6、修改:c命令 7、打印行号:=命令 8、打印(包括控制字符):l命令 9、字符转换:y命令 10、读取下一行:n命令 11、读取文件:r命令 12、保存文件:w命令 13、退出:q命令 14、读取下一行以\n拼接上一行:N 15、打印至\n的内容:P 16、删除上一行:D 17、保持空间命令:h/H,g/G,x 改变流 1、分支 branch 2、测试 test sed(Stream EDitor),是一种流编辑器,用于文本编辑 语法 sed [option] 'SCRIPTS' FILE... SCRIPTS:[Address] [!]Command 命令地址对 SED工作流程 读取新的一行到模式空间,将“SCRIPTS”的第一个address匹配,如果符合则执行command 如果address符合则执行command,不符合取下一个地址命令对 直到所有的地址命令对应用完,输出模式空间的内容 选项 选项 功能 -f FILE 调用sed脚本处理文件 -n 抑制默认内容输出,常与p命令连用 -r 支持扩展元字符 -iSUFFIX 修改源文件,同时创建一个备份文件

linux常用命令(六)

橙三吉。 提交于 2020-02-29 22:18:45
用于查找系统文件的相关命令 grep find locate grep:查找文件中符号条件的字符串(关键词) 命令语法:grep [选项] 查找模式 [文件名] 选项 选项含义 -E 模式是一个可扩展的正则表达式 -F 模式是一组有断行符分隔的定长字符串 -P 模式是一个Perl正则表达式 -b 在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量 -c 只显示匹配行的数量 -i 比较时不区分大小写 -h 抑制输出的文件名前缀 -l 只显示匹配的文件名 -L 只显示不匹配的文件名 -n 在输出前加上匹配字符串所在行的行号(文件首行行号为1) -v 只显示不包含匹配字符的行 -x 强制模式仅完全匹配一行 -w 强制模式仅完全匹配字词 -e<模式> 用模式来进行匹配操作 -f<文件> 从文件取得模式 -r 递归读取每个目录下的所有文件 -q 禁止一切注册输出 -I 强制认为该二进制文件没有包含任何搜索样式 -s 取消错误消息 --color 显示颜色 例子:在/etc/passwd文件中过滤出包含sy的行 [root@localhost ~]# grep sy /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync systemd-network:x:192:192:systemd Network Management:/:/sbin

贪婪模式与非贪婪模式

百般思念 提交于 2020-02-29 17:43:12
一、概念 1、什么是正则表达式的贪婪与非贪婪匹配    如:String str="abcaxc";     Patter p="ab.*c";   贪婪匹配: 正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到: abcaxc (ab.*c)。    非贪婪匹配: 就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到: abc (ab.*c)。   贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在 整个表达式匹配成功 的前提下,尽可能多的匹配,而非贪婪模式在 整个表达式匹配成功 的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。 2、编程中如何区分两种模式    默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。   下面的都是量词: {m,n}:m到n个      *:任意多个      +:一个到多个   ?:0或一个   几个常用的非贪婪匹配Pattern: *? 重复任意次,但尽可能少重复 +? 重复 1次或更多次,但尽可能少重复 ?? 重复 0次或 1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复 二、sublime与PHP的正则表达式之间的差异点   1、PHP匹配正则可以使用定界符

串的模式匹配 : KMP算法

巧了我就是萌 提交于 2020-02-28 21:09:03
当存在 [1] 这样的现象,[2] 这样的做法,是否合理以及正确,或者有 [1] 这样的现象,为什么就可以有 [2] 这样的做法 ? 算法思想 [1] 当主串的 第i个字符与子串的第j个字符失配时 ,若子串的 前(k-1)个字符 和子串的 后(k-1)个字符 匹配, ‘p 1 ……p k-1 ’=‘p j-k+1 ……p j-1 ’ ,则只需主串 S 的第 i 个字符与子串 P 的第 k 个字符开始向后比较即可,i 不必回溯。 [2] k的值只与子串的组成有关,而与主串无关,即 k 值与 j 失配位置之前的子串的结构相关,每一个 j 位置对应一个k值,用next[j]存储,表示 当模式串中第 j 个字符与主串中第 i 个字符失配时 ( S i ≠ P j ) , 下一次模式串 P 中第next[j]个字符与主串 S 的第i个字符比较 。 简而言之 若子串中,‘p 1 ……p k-1 ’=‘p j-k+1 ……p j-1 ’,则在 j 处的失配,i 不回溯,直接和子串的 k 位置比较即可,k位置用 next[j] 存储。 问题提出 其实,算法思想中[1]是 现象 ,也就是子串中需要存在这样的前后缀相等时,[2]是 做法 ,表示在失配的位置 j ,模式串应该向右滑动 k 距离。那么当存在这样的现象,这样的做法,是否合理以及正确?或者有 [1] 这样的现象,为什么就可以有 [2]

JavaScript中的正则表达式解析

情到浓时终转凉″ 提交于 2020-02-28 15:52:27
正则表达式是一个描述字符模式的对象。   JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法.   在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp对象,也可以用JavaScript 1.2中的新添加的一个特殊语法来创建RegExp对象.就像字符串直接量被定义为包含在引号内的字符一样,正则表达式直接量也被定义为包含在一对斜杠(/)之间的字符.所以,JavaScript可能会包含如下的代码: var pattern = /s$/;   这行代码创建一个新的RegExp对象,并将它赋给变量parttern.这个特殊的RegExp对象和所有以字母"s"结尾的字符串都匹配.用RegExp()也可以定义一个等价的正则表达式,代码如下: var pattern = new RegExp("s$");   无论是用正则表达式直接量还是用构造函数RegExp(),创建一个RegExp对象都是比较容易的.较为困难的任务是用正则表达式语法来描述字符的模式.JavaScript采用的是Perl语言正则表达式语法的一个相当完整的子集.   正则表达式的模式规范是由一系列字符构成的.大多数字符(包括所有字母数字字符)描述的都是按照字面意思进行匹配的字符

KMP模式匹配算法

↘锁芯ラ 提交于 2020-02-27 20:07:01
title: KMP模式匹配算法 date: 2020-02-26 17:24:29 tags: datastructure 这几天复习到数据结构的串的模式匹配,看到KMP算法那么寥寥几行的代码,原本觉得这部分内容很简单,直到我开始尝试去理解它,我才发现我跟大佬的差别。 KMP算法的基本思路 KMP算法,是名分别为K、M、P的三个美国大佬发明的,算是对传统的朴素模式匹配算法的改进。我们先规定,讨论模式串下标均从1开始。朴素模式匹配算法就不谈了,这个有脑子就能想出来,但朴素模式匹配算法存在一个弊端——当模式串有较多重复元素存在时,主串指针i其实做了很多没有必要的回溯。 而如果想跳过这些没有必要比较的情况,那么就可以想到,主串指针是没有必要回退的,因为当发生与模式串失配的情况时,可以确定的是,此前成功匹配的若干元素形成的字串,其实就是模式串的一个真字串,那么对于这样的一个字串,它的头部和尾部如果发生了重复,就只需要往回移动模式串指针就好了,但是又不需要往回移到初始位置,因为我们看到他的头部和尾部发生了重复,又由于这个头部重复的部分与现在主串指针前的那个模式串真字串重复,而这部分就是真字串的尾部,所以最有利的做法应该是将模式串指针移动至头部重复字串的后一位,再来与当前的主串指针比较。这样,就避免了主串的回溯,单就这个算法本身,简单来看时间复杂度应该是o(n)。 以下是KMP主代码

《算法》笔记 15

拜拜、爱过 提交于 2020-02-27 08:10:22
暴力子字符串查找算法 隐式回退 性能 显式回退 Knuth-Morris-Pratt算法 确定有限状态自动机 DFA的构造 性能 Boyer-Moore算法 跳跃表的构建 性能 Rabin-Karp指纹字符串算法 关键思想 Horner方法 性能 字符串的一种基本操作就是子字符串查找。比如在文本编辑器或是浏览器中查找某个单词时,就是在查找子字符串。子字符串的长度(可能为100或1000)相对于整个文本的长度(可能为100万甚至是10亿)来说一般是很短的,在如此多的字符中找到匹配的模式是一个很大的挑战,为此计算机科学家们发明了多种有趣、经典且高效的算法。 ### 暴力子字符串查找算法 要解决这个问题,首先想到的是暴力查找的方法,在文本中模式可能出现匹配的任何地方检查是否匹配。 #### 隐式回退 首先是隐式回退的实现方式,之所以叫隐式回退,在与显式回退的实现对比后就明白原因了。 public static int search(String pat, String txt) { int patL = pat.length(); int txtL = txt.length(); for (int i = 0; i <= txtL - patL; i++) { int j; for (j = 0; j < patL; j++) if (txt.charAt(i + j) != pat