正则表达式怎样匹配任意字符

正则表达式怎样匹配任意字符,第1张

匹配任意字符 [\s\S] 或者 [\w\W]

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

许多程序设计语言都支持利用正则表达式进行字符串 *** 作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)) *** 作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。

Public Sub ModProj()'填充项目立项分值及结题分值Dim i As IntegerDim bl As BooleanFor i = 1 To ActiveCell.SpecialCells(xlLastCell).RowSelect Case blCase Cells(i4062 5) Like "*" & "国家自然基金" & "*"Cells(i05 8) = 240Case Cells(i739 5) Like "*" & "国防基础" & "*"Cells(i, 8) = 50End SelectNext iEnd Sub

#include<stdioh>

#include<conioh>

#include<stringh>

char fun(char str, char begin, char end);

char fun(char str, char begin, char end)

{

char s, d;

int i;

s = strchr(str, begin);

d = strchr(str, end);

if(s && d)

for(i = 0; i <= d-s; i++)

printf("%c", (s+i));

return s;

}

void main(void)

{

char s[100];

char begin, end;

printf("请输入字符串:");

scanf("%s", s);

fflush(stdin);

printf("请输入起始字符:");

begin = getchar();

fflush(stdin);

printf("请输入结束字符:");

end = getchar();

fun(s, begin, end);

getch();

}

本文主要讲述了串的模式匹配算法,包括BF算法、RK算法、KMP算法、BM算法,使用不同的算法实现目标串查找子串,重点在于分析的过程,通过不同的算法分析提高逻辑思维能力

模式匹配的目的就是在目标串中查找与模式串相等的子串。在这里称呼主串为s,模式串为t,主串的长度为n,模式串的长度为m

暴力算法,将目标串和模式串的每个字符都进行一一比较。性能最差,但是使用最广,因为实现简单,而且在字符串较小的情况下耗费的性能也很小。

O(nm)

RK算法把字符串比较问题,转换为了Hash值比较问题。

将模式串t的每个字符的比较改成了将串作为整体与目标串进行哈希值比较,这样就减少了比较次数

以前模式串与子串的比较需要比较每个字符,现在只要整体比较依次哈希值就可以。所以减少了比较次数。

哈希算法

这里我们可以发现一个Hash冲突问题,比如"abc"和"bc"的Hash值是一样的,因为最高位是0。所以还需要进行哈希冲突算法。

哈希冲突算法:

利用前一个结果计算下一个哈希值

这是因为目标串的相邻子串,其实相差的只有第一个字符和最后一个字符,其他字符是相同的,

所以我们可以利用前一个计算结果减去前一个字符串的第一个字符串,加上这个字符串的最后一个字符就够了。

针对BF的弊端,在KMP算法中可以进行多字符的跳跃对比,以此来避免目标串的不必要回溯。

例子:

简单说明一下:

真子串:

匹配:

例如:目标串:"abxabcabcaby",模式串:"abcaby"

模式串的最大真子串为ab,

我们在匹配时,发现目标串的子串abcabc与模式串的前字符都匹配,最后一个字符不匹配

所以就从目标串的abcabc的后面abc开始与模式串进行匹配,而不需要匹配前面的abc了。

也就是从上一个a字符直接跳跃到了下一个a字符,而不是从b字符开始。

会存在一种情况:

实现思想:

它是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP算法的三四倍。BM算法的原理很多复杂,比较难懂,学起来比较烧脑。

实现思想和KMP算法基本上是一样的,都是先计算模式串的真子串,之后再查找真子串的大小,当出现不匹配时,直接在真子串后进行匹配,区别于KMP算法,它是从后往前匹配的

这里比上面的KMP算法增加了一个坏字符规则,可以更快的跳跃,当然KMP算法本身也可以使用坏字符规则

坏字符规则

好后缀规则

现在最常用的此类算法是改进的KMP算法。/Name: KMP算法演示Copyright: >

可以使用vim打开文件,然后通过 vim编辑 中的 /(向后查找)或者 (向前查找)来查找相应的字符串。

示例:用vim打开/etc/passwd查找admin用户名

vim /etc/passwd

打开文件后,直接输入 /admin 回车即可查找如下图所示:

回车执行,vim查找到后,会标识出来,如下图所示:

另外:使用vim也可以打开可执行程序来查找字符串(在程序没有加壳或者使用其它字符串保护的前提下)。

示例:在test程序中查找hello字符串。

虽然使用vim打开二进制程序文件,显然的是乱码,但是明文字符串依然能查找到,如下图所示:

扩展:在Linux中如果要查找二进程文件即应用程序中的字符串,可以使用反汇编器、调试器等等,比如IDA,就提供强大的字符串查找功能。

以上就是关于正则表达式怎样匹配任意字符全部的内容,包括:正则表达式怎样匹配任意字符、中文字符串模糊匹配、C程题目:输入一个字符串后再输入2个字符,输出此字符串中从与第一个字符匹配的位置开始到与第二个字。。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10164247.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存