模式匹配

字符串的模式匹配

◇◆丶佛笑我妖孽 提交于 2019-11-28 10:03:29
承上启下 对于上篇中@Samaritains给的意见,底下查了一下,发现match()这个方法用在那里真的是太合适了。 var sum = document.getElementById('sum'); var click = document.getElementById('click'); click.addEventListener('click',function add(){ var pattern = /\d+/g; var c = 0; var d = sum.value.match(pattern); for(var i = parseInt(d[0]); i <= parseInt(d[1]); i ++){ c +=i; } alert(c); },false); 首先match返回的是一个数组,而且对于文本框输入的格式没有了太多限制,只要输入的2个数字不是紧挨着的(当然中间也不可以用数字的),那么就可以得到想要的结果。Samaritains的一句话犹如海港的灯塔,指明了方向。既然提到了match,顺便杂谈下字符串的匹配。 字符串的模式匹配 1.match与字符串的羁绊 match() 方法将检索字符串 stringObject,以找到一个或多个与 RegExp 匹配的文本,并返回一个数组。match()只接受一个参数,要么是正则表达式

字符串的模式匹配

对着背影说爱祢 提交于 2019-11-28 10:03:19
问题描述:如果子串T在主串中存在,则返回存在的位置,如果不存在,则返回-1。 1.基本方法 从主串的第pos位置字符开始和模式子串字符比较,如果相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式子串的字符比较。直到找到匹配字符串或者是主串结尾。 伪代码如下: Index(T,S,pos) i <- pos j <- 1 while i<=length[T] and j<=length[S] if T[i]=S[j] i++ j++ else i <- i-j+2 j <- 1 if j> length[S] return i-lenght[S] else return -1; 例如,主串T为:ababcabababab,子串为ababa,上述过程如下图所示。 源代码如下: /* 检测从主串T的pos位置开始,是否有和子串S匹配,如果有返回匹配开始位置,如果没有,返回-1 T:主串 S:子串 tlength:主串长度 slength:子串长度 pos:主串开始位置 */ int Index (char T[],char S[],int tlength,int slength,int pos) { int j=0,i=pos; while(i<tlength&&j<slength) { if(T[i]==S[j]) { i++; j++; } else { i=i-j

字符串模式匹配KMP算法

允我心安 提交于 2019-11-28 10:03:03
字符串模式匹配指的是,找出特定的模式串在一个较长的字符串中出现的位置。 朴素的模式匹配算法 很直观的可以写出下面的代码,来找出模式串在一个长字符串中出现的位置。 1: /* 2: 朴素的模式匹配算法 3: 功能:字符串的模式匹配 4: 参数: 5: s:目标串 6: p:模式串 7: pos:开发匹配的位置 8: 返回值: 9: 匹配成功,返回模式串在目标串的其实位置 10: 匹配不成功,返回-1 11: */ 12: int match(const char * s ,const char * p,int pos){ 13: int i = pos ; 14: int j= 0 ; 15: while(s[i] != '\0' && p[j] != '\0') { 16: if(s[i] == p[j]) { 17: i ++ ; 18: j ++ ; 19: }else { 20: i = i - j + 1; 21: j = 0 ; 22: } 23: } 24: 25: if(p[j] == '\0') 26: return i - j ; 27: else 28: return -1 ; 29: } /*--> */ /*--> */ 上面的代码,s就是目标串,p是模式串,pos指定从s的什么位置开始匹配p。其实现思想也很简单: 当s[i] == p[j]时

字符串 模式匹配

假装没事ソ 提交于 2019-11-28 10:02:39
要点 模式匹配 是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是 模式匹配 。 假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。 文中代码是本人自己写的,实测有效,含JAVA和C++两种代码。干货充足吧。 蛮力算法 (BF算法) 蛮力算法(Brute-Force),简称 BF算法 。(男朋友算法,简单粗暴—_—!) 算法思想 BF算法的 算法思想 是: 从 目标串T 的的第一个字符起与 模式串P 的第一个字符比较。 若相等,则继续对字符进行后续的比较;否则目标串从第二个字符起与模式串的第一个字符重新比较。 直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。 通过下图示例,可一目了然: 算法性能 假设模式串的长度是m,目标串的长度是n。 最坏的情况 是每遍比较都在最后出现不等,即没变最多比较m次,最多比较n-m+1遍。 总的比较次数最多为m(n-m+1),因此BF算法的时间复杂度为O(mn)。 BF算法中 存在回溯 ,这影响到效率,因而在实际应用中很少采用。 代码 JAVA版本 1 public class

081 re正则表达式模块

老子叫甜甜 提交于 2019-11-28 08:39:34
目录 一、正则表达式 二、re模块的基本语法 ^ 元字符 $ 元字符 [] 元字符(字符集) [^] 反取 . 任意字符(换行符除外) * 对前一个字符0-无穷次扩展 + 对前一个字符1-无穷次扩展 ? 对前一个字符0或1次扩展 {m} 对前一个字符扩展m次 {m,n} 对前一个字符扩展m-n次(含n) \d 匹配单个数字(0-9) \D 匹配单个非数字(包括\n) \w 匹配 数字/字母/下划线 \W 匹配 非数字/非字母/非下划线 \s 匹配 空格/ \t/ \n \S 匹配 非空格/ 非\t/ 非\m () 只要括号内的 | 左右两边的字符都要 .* 贪婪模式 **.*? 非贪婪模式** 三、re模块中常用功能函数 3.1 正则表达式的两种书写方式 3.2 re.compile(strPattern[, flag])函数 3.2.1 re.S 3.2.2 re.I 3.2.3 re.M 3.2.4 re.sub 3.3 分组函数 3.4 re.match(pattern, string[, flags])函数(常用) 3.5 re.search(pattern, string[, flags])函数 3.6 re.findall(pattern, string[, flags])函数(常用) 3.7 re.split(pattern, string[, maxsplit]

Python正则表达式\W*和\W*?匹配过程遇到的问题

那年仲夏 提交于 2019-11-28 08:31:52
老猿在分析《 Python正则表达式\W+和\W*匹配过程的深入分析 》中的问题时,想到一个问题,如果“re.split(’(\W*)’,‘Hello,world’)”的处理如果换成非贪婪模式会怎么样,根据老猿的预测,由于在’Hello,world’中没有连续的非单词字符,因此贪婪模式处理和非贪婪模式结果应该一样,如是测试了一下看看效果: >>> re.split('(\W*)','Hello,world') #贪婪模式 ['', '', 'H', '', 'e', '', 'l', '', 'l', '', 'o', ',', '', '', 'w', '', 'o', '', 'r', '', 'l', '', 'd', '', ''] >>> re.split('(\W*?)','Hello,world') #非贪婪模式 ['Hello,world'] >>> 看到这结果老猿完全懵圈了,这完全推翻了《 Python正则表达式\W+和\W*匹配过程的深入分析 》的分析过程。但执行结果肯定是正常的,肯定是老猿自己的问题,大家觉得问题出在哪里呢? 不卖关子了,《 Python正则表达式\W+和\W*匹配过程的深入分析 》的分析过程应该是没有问题的,问题出在输入的问号上,半角的问号被输入成了全角问号,导致匹配不到对应的搜索文本,所以就将原串作为列表的元素整个返回了

Web服务器-正则表达式-整理+复习(3.1.1)

白昼怎懂夜的黑 提交于 2019-11-28 07:21:09
目录 1.常用api 2.例子 3.正则表达式模式 关于作者 @ 参考文章 1.常用api re.match(pattern, string, flags=0) pattern 匹配的正则表达式 string 要匹配的字符串。 flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志 re.group(index) re.groups() 一个按照index返回匹配到的,一个返回所有 2.例子 #!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I) if matchObj: print ("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ", matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2)) 3.正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

藏在正则表达式的陷阱

試著忘記壹切 提交于 2019-11-28 07:05:44
大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了分布式锁,今天给大家分享一下正则表达式的知识。 前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。 通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处。 通过排查代码,我们知道这个方法的主要功能是校验 URL 是否合法。很奇怪,一个正则表达式怎么会导致 CPU 利用率居高不下。 为了弄清楚复现问题,我们将其中的关键代码摘抄出来,做了个简单的单元测试。 public static void main(String[] args) { String badRegex = "^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\\\/])+$"; String bugUrl = "http://www.fapiao.com/dddp-web/pdf/download?request

SQL模糊查询的四种匹配模式

谁说胖子不能爱 提交于 2019-11-28 06:38:55
执行数据库查询时,有 完整查询 和 模糊查询 之分,一般模糊语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 一、四种匹配模式 关于条件,SQL提供了四种匹配模式: 1、% 表示任意0个或多个字符,可匹配任意类型和长度的字符。有些情况下是中文,需用两个百分号(%%)表示: SELECT * FROM [user] WHERE u_name LIKE ‘%三%’ 将会把 u_name 为“张三”、“张猫三”、“三脚猫”、“唐三藏”等有“三”的记录全找出来 另外,如果须要找出 u_name 中既有“三”又有“猫”的记录,请运用 and 条件 SELECT * FROM [user] WHERE u_name LIKE ‘%三%’ AND u_name LIKE ‘%猫%’ 如果运用: SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%’ 虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三” 2、_ 表示任意单个字符。匹配单个任意字符,它常用来限定表达式的字符长度语句: SELECT * FROM [user] WHERE u_name LIKE ‘三’ 只找出“唐三藏”这样 u_name 为三个字且中间一个字是“三”的; 再比如 SELECT * FROM [user] WHERE u_name LIKE ‘三

spark笔记之模式匹配和样例类

放肆的年华 提交于 2019-11-28 05:33:24
阶有一个十分强大的模式匹配机制,可以应用到很多场合:如开关语句,类型检查等并且阶还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。 1.1。匹配字符串 package cn.itcast.cases import scala.util.Random object CaseDemo01 extends App{ val arr = Array("hadoop", "zookeeper", "spark") val name = arr(Random.nextInt(arr.length)) name match { case "hadoop" => println("大数据分布式存储和计算框架...") case "zookeeper" => println("大数据分布式协调服务框架...") case "spark" => println("大数据分布式内存计算框架...") case _ => println("我不认识你...") } } 1.2. 匹配类型 package cn.itcast.cases import scala.util.Random object CaseDemo01 extends App{ val arr = Array("hello", 1, 2.0, CaseDemo) val v = arr(Random.nextInt(4))