模式匹配

BM算法详解

匿名 (未验证) 提交于 2019-12-03 00:22:01
原帖链接: BM算法详解 来源 在没有BM算法时,其原始算法是从后往前进行匹配,需要两层循环,判断以某个字符为结尾的子串是否和模式串相等,这种算法也称作暴搜; 贴上代码: void BLS( string s, string p) { int s_len = s. size (), p_len = p. size (); int j = 0 , i = 0 ; while (j <= s_len - p_len) { for (i = p_len - 1 ; i >= 0 && p[i] == s[i + j]; --i) {} if (i < 0 ) { cout << "match: " << i + j + 1 << endl; j += p_len; } else j++; } } 算法的思想还是比较容易理解的,i和j分别指的是,模式串中已经匹配的位数,模式串相对于原串移动的位数; 算法包含了两个重要的内容,分别是好后缀和坏字符的规则; 坏字符 :当模式串和原串的字符并不匹配时,原串中的字符就称为坏字符; 好后缀 :模式串和原串的字符相等时所有的字符串,比如ABCD和BCD,那么它的好后缀则包括第一次匹配的D,和第二次匹配的CD,还有第三次的BCD; 例子: BM算法的向右移动模式串的距离就是取坏字符和好后缀算法得到的最大值; 这两个内容分别拥有着几条规则,需要注意:

Scala中的模式匹配

匿名 (未验证) 提交于 2019-12-02 23:57:01
1.匹配基本类型 1.观察如下实例: object Demo_037 { def main(args: Array[String]): Unit = { val oper = '#' val n1 = 20 val n2 = 10 var res = 0 oper match { case '+' => res = n1 + n2 case '-' => res = n1 - n2 case '*' => res = n1 * n2 case '/' => res = n1 / n2 case _ => println("oper error") } println("res=" + res) } } 如果所有case都不匹配,那么会执行case _ 分支,类似于Java中default语句 如果所有case都不匹配,又没有写case _ 分支,那么会抛出MatchError 每个case中,不用break语句,自动中断case 可以在match中使用其它类型,而不仅仅是字符 => 等价于 java swtich 的 : => 后面的代码块到下一个 case, 是作为一个整体执行,可以使用{} 扩起来,也可以不扩。 2.如果存在多个默认匹配的情况,则只有一个会生效 object Demo_039 { def main(args: Array[String]): Unit = {

剑指offer52:正则表达式匹配

匿名 (未验证) 提交于 2019-12-02 23:56:01
1 题目描述   请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符‘.’表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 2 思路和方法   正则表达式中有三种情况:   a.普通字符   b.字符’.’   c.普通字符或’.’ + 字符’*’   碰到情况a、b都直接对比可以匹配,   难点在于处理情况c   情况c可以分两种子情况处理:   c1.字符串的首字母与模式的首字母不匹配,模式直接右移两格(相当于’*’前面的字符出现了0次)   c2.字符串的首字母与模式的首字母匹配,则:     字符串右移一格,模式不移动(’*’前面的字符出现了不止一次)     或字符串右移一格,模式右移两格(’*’前面的字符出现了刚好一次)     或字符串不移动,模式右移两格(’*’前面的字符出现了0次)   当字符串和模式同时走到结尾+1的位置,则表示匹配   当字符串走到结尾+1的位置,模式还没走到结尾+1的位置,还要继续匹配(因为模式后面可能还有a*b*可以匹配0个字符串)   当字符串还没走到结尾+1的位置,模式走到结尾+1的位置,则表示不匹配 3 C++核心代码 1 class

模式匹配算法

匿名 (未验证) 提交于 2019-12-02 23:49:02
模式匹配算法: 定义一个主串字符串S="goodgoogle",再定义一个子串字符串T="google",然后依次遍历主串中的字符,判断子串是否在主串中存在,这种子串的定位操作通常称为串的模式匹配 代码: 1 /** 2 * 朴素的模式匹配算法 3 * @author wydream 4 * 5 */ 6 7 public class OrdinaryModel { 8 9 public static void main ( String [] args ) { 10 String str = "goodgoogle" ; //在该字符串中查找 11 String searchStr = "d" ; //需要查找的字符串 12 //将字符串转化为StringBuffer,方便操作 13 StringBuffer bfStr = new StringBuffer ( str ); 14 StringBuffer bfSearch = new StringBuffer ( searchStr ); 15 int diff = bfStr . length ()- bfSearch . length (); 16 //如果两个字符串中有一个为空,则重新输入 17 if ( bfStr . length ()== 0 || bfSearch . length ()== 0 ){ 18

Sword 正则表达式

时光毁灭记忆、已成空白 提交于 2019-12-02 23:43:51
Metacharacters(元字符) 在正则表达式中有一些具有特殊含义的字母,被称为元字符,简言之,元字符就是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 ^ 匹配输入字符串的开始位置(除非在方括号表达式中使用,此时它表示不接受该字符集合)。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。 {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o'

Linux三剑客--sed用法

匿名 (未验证) 提交于 2019-12-02 21:56:30
格式:   sed [OPTION]... {script-only-if-no-other-script} [input-file]... 常用选择:   i    :修改内容   i.bak  :先备份,然后再修改内容   r    :支持正则表达式   e    :支持多点编辑   n    :不输出模式空间内容到屏幕,即不自动打印 '地址定界+[高级]编辑命令'   地址定界      1.不给地址:       对全文进行处理      2.单地址:       #:指定的行 , $:最后一行       /pattern/:被此处模式所能够匹配到的每一行      3.地址范围       #,#       #,+#       /pat1/, /pat2/       #,/pat1/      4. ~:步进        1~ 2 奇数行        2~ 2 偶数行   编辑命令     d:删除模式空间匹配的行,并立即启用下一轮循环     p:打印当前模式空间内容,追加到默认输出之后     a[\]text:在指定行后面追加文本,支持使用\n实现多行追加     i[\]text:在行前插入文本     c[\]text:替换行为单行或多行文件     w /path/somefile:保存模式匹配的行至指定文件     r /path

()、(())、[]、[[]]、{}的作用

老子叫甜甜 提交于 2019-12-02 20:20:33
目录 单括号(): 单中括号[ ]: 双中括号[[]]: 大括号{}: Linux Shell脚本攻略:shell中各种括号()、(())、[]、[[]]、{}的作用 技巧小结: 字符串比较用双中括号[[ ]];算数比较用单中括号[ ]——左右留空格 算数运算用双小括号(( )) ;shell命令及输出用小括号( )——左右不留空格 快速替换用花括号{ }——左右留空格 反单引号起着命令替换的作用 单括号(): 另开命令组——小括号中的内容会开启一个子shell独立运行;括号中以分号连接,最后一个命令不需要;各命令和括号无空格 得到命令输出——a=$(command), 等同于a=$`command`,得到命令输出传递给变量a 初始化数组——array=(a b c d) 双括号(()): 省去$符号的算术运算—— for((i=0;i<5;i++)); if (($i<5)); a=5; ((a++)) 可将 $a 重定义为6;括号内支持多个表达式用逗号分开。 C语言规则运算——$((exp)),exp为符合C语言规则的运算符,表达式 跨进制运算——二进制、八进制、十六进制运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制) 单中括号[ ]: 字符串比较——==和!= 整数比较——不等于:-gt:大于;-lt :小于;-eq

正则表达式格式

走远了吗. 提交于 2019-12-02 19:50:27
正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。 多数字母和数字前加一个反斜杠时会拥有不同的含义。 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。 反斜杠本身需要使用反斜杠转义。 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t' ,等价于 \\t )匹配相应的特殊字符。 下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。 模式 描述 ^ 匹配字符串的开头 $ 匹配字符串的末尾。 . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 [...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' [^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 re* 匹配0个或多个的表达式。 re+ 匹配1个或多个的表达式。 re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 re{ n} 匹配n个前面表达式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。 re{ n,} 精确匹配n个前面表达式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配

shell 文本处理之 awk

﹥>﹥吖頭↗ 提交于 2019-12-02 19:49:38
awk是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及生成报表等等。 基本的命令语法:awk option 'pattern {action}' file 其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号用于根据特定的模式对一系列指令进行分组。 awk处理的工作方式与数据库类似,支持对记录和字段处理,这也是grep和sed不能实现的。 在awk中,缺省的情况下将文本文件中的一行视为一个记录,逐行放到内存中处理,而将一行中的某一部分作为记录中的一个字段。用1,2,3...数字的方式顺序的表示行(记录)中的不同字段。用$后跟数字,引用对应的字段,以逗号分隔,0表示整个行。 在Linux系统下默认awk是gawk,它是awk的GNU版本。可以通过命令查看应用的版本:ls -l /bin/awk 选项 描述 -f program-file 从文件中读取awk程序源文件 -F fs 指定fs为输入字段分隔符 -v var=value 变量赋值 --posix 兼容POSIX正则表达式 --dump-variables=[file] 把awk命令时的全局变量写入文件, 默认文件是awkvars.out --profile=[file] 格式化awk语句到文件,默认是awkprof.out 模式