精华内容
下载资源
问答
  • [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]但是这样必须包含”_”否则就会输出falsh 要求的效果为 出现两个 “_” 才false,并且没有“_”的情况下也是true [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
  • 题目描述 请实现一个函数用来匹配包括.和✳的正则表达式。模式中的字符’.'表示任意一个字符,而✳表示它前面的字符可以出现任意(包含0)。 在本题中,匹配是指字符串的所有字符...只匹配一个字符,且可以充当任

    题目描述
    请实现一个函数用来匹配包括.和✳的正则表达式。模式中的字符’.'表示任意一个字符,而✳表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab✳ac✳a"匹配,但是与"aa.a"和"ab✳a"均不匹配
    题意解析
    可能这个题目比较绕,直接看不容易看懂,下面我先把题目的意思分析一下,捋清思路。
    node1:字符串是被动对象,要用来与模板进行匹配
    node2:正则表达式在题目中给出了.和✳,.只匹配一个字符,且可以充当任何字符进行匹配;*可以匹配0至多个字符
    解题分析
    step.1:首先考虑两个字符串都为空的情况,结果肯定能够实现匹配
    step.2:然后考虑字符串不为空,但是模板为空的情况,肯定不能够实现匹配
    step.3:如果程序能执行到这,说明前两点都不符合,这时要考虑模板中仅有.的情况
    该过程从头将字符串与模板挨个字符进行比较,如果两字符相等就继续比较下一个,如果模板中有.也继续比较下一个,当字符串为空时表明全匹配上。否则就没有完成匹配。
    step.4模板中含有✳,有没有.不重要。由于✳出现的时候不确定表示的时它前面字符重复的0次或者是1次至多次,因此又要分为两种情况:
    (1):✳表示它前面出现字符重复0次,重复0次的含义就是✳和它前面的字符不存在,这时模板就少了两个字符
    (2):✳表示它前面的字符出现1次或者多次,这样的话需要将字符串中的字符每次往后取出一个与之比较。
    鉴于对上述的分析,题目可以使用两种方法解决得到,第一种是递归,第二种就是动态规划,首先来分析一下递归,以及它的出口条件。
    递归方法分析
    设字符串为s,长度为sn;模板为p,长度为pm。对于p的第i位,有正常字符,.和✳三种情况。
    (1)p[i]为正常字符,只需要比较(s[i]=p[i])是否成立,如果成立且两个串都不为空继续比较下一次,设递归函数为dfs,则执行dfs(s[i+1],p[i+1]),到i=sn或者pm的时候结束
    (2)p[i]=.,因为.可以匹配任意字符,因此只需要比较dfs(s[i+1],p[i+1])即可
    (3)如果p[i]=✳,表明p[i-1]存在0或者多次,如果存在0次时,比较s[i]和p[i+2]
    如果存在1次或者多次,比较s[i+1]和p[i]。
    下面根据递归的逻辑,把代码设计一下

    class Solution {
    public:
        bool match(char* str, char* pattern)
        {
            //两个串都是空的
            if(*str=='\0'&&*pattern=='\0')return true;
            //如果模板是空串而匹配对象非空
            if(*str!='\0'&&*pattern=='\0')return false;
            //如果两个串不存在为空的情况,正式进行比较,先看最简单的只有.的情况
            //这个地方需要注意一下,如果p[i]为*,且表示*前面的字符出现0次,那么我们在对s[i-1]和p[i-1]比较时,比较的结果就失效了,为了避免这种情况,我们需要判断p[i+1]是不是*,这样就不会出现这个问题
            if((*(pattern+1))!='*'){
                //对应位置是否相等,或者为.
                //条件一str!='\0'是为了保证str能够匹配完,只要是pattern先比较完,那一定不匹配,这个地方不矛盾
                if(*str!='\0'&&(*str==*pattern||*pattern=='.'))return match(str+1, pattern+1);
                else
                    return false;
            }
            //模板里面有*的情况
            else{
                //两种情况
                //*表示0个匹配的时候,直接模板+2后的位置与字符串当前位置进行比较
                bool rest=false;
                //表示的是*表示它前面一个或者多个字符重复时的情况
                if(*str!='\0'&&(*str==*pattern||*pattern=='.'))rest=match(str+1, pattern);
                //*表示0个字符的情况
                //由于不知道具体表示了几个,因此取两者的或,只要满足一个即可
                return rest||match(str, pattern+2);
            }
        }
    };
    

    下面分析一下动态规划是如何实现的
    如果前面的分析都能明白,那动态规划就好理解一点了
    动态规划涉及到二维向量的使用,这个不明白的可以去我的博客里面找一下,有一篇是专门详细的介绍向量的使用的。
    动态规划是一个自底向上的过程,正好与递归相反
    设vec[i][j]表示str的前i个和pattern的前j个能够匹配。
    则vec[0][0]=1
    vec[1…sn][0]=0
    对于为.的情况,vec[i][j]=vec[i-1][j-]
    对于有✳的情况分为两种:
    (1)✳表示0重复:vec[i][j]=vec[i][j-2]
    (2)✳表示1或者多重复,vec[i][j]=vec[i-1][j]
    代码如下:

    class Solution{
    	public:
    	bool match(char *s,char *p){
    		//求出两个字符串的长度,定义二维向量时的长度要使用两个字符串的长度
    		int sn=strlen(s);
    		int pn=strlen(p);
    		//定义一个二维向量
    		vector<vector<char>> f(sn+1,vector<char>(pn+1,0));
    		for(int i=0;i<=sn;i++){
    			for(int j=0;j<=pn;j++){
    				//j=0时,i=0,f[i][j]=1,否则都为0
    				if(j==0)f[i][j]=(i==0);
    				else{
    					//没有*的情况
    					if(p[j-1]!='*'){
    						if(i>=1&&(s[i-1]==p[j-1]||p[j-1]=='.'))f[i][j]=f[i-1][j-1];
    					}
    					//有*的情况
    					else{
    						if(j>=2)f[i][j]|=f[i][j-2];
    						if(i>=1&&(s[i-1]==p[j-1]||p[j-1]=='.'))f[i][j]|=f[i-1][j];
    					}
    				}
    			}
    		}
    		return f[sn][pn];
    	}
    }
    
    展开全文
  • 注: (1)pre_match只匹配一次,而pre_match_all匹配所有的(2)前者是一维数组,而后者是二维数组(3)函数返回值对应匹配次数 注: (1)两者支持数组匹配替换,即$pattern, $replacement, $subject均可以为数组...
    1. 这里写图片描述
      注:$pattren 正则表达式
      $subject 匹配的目标数据

    2. 这里写图片描述
      注: (1)pre_match只匹配一次,而pre_match_all匹配所有的(2)前者是一维数组,而后者是二维数组(3)函数返回值对应匹配次数

    3. 这里写图片描述
      注: (1)两者支持数组匹配替换,即$pattern, $replacement, $subject均可以为数组(2)replace保留所有数组的串,而filter只保留发生了替换的数组

    4. 这里写图片描述
      注: 只匹配,不替换

    5. preg_split(pattern,arrayinput)
      explode()是上述函数额一个子集
      注: 分割
    6. preg_quote($str)
      把一个字符串中的正则运算符转义
    展开全文
  • Perl正则表达式 模式匹配

    千次阅读 2016-07-01 11:45:37
    编译模式一次。用于优化搜索流程 s 嵌入换行符时,将字符串作为单行处理 x 允许在正则表达式中提供注释,并忽略空白字符 g 全局匹配,即查找所有具体值。如果用于数组型上下文语境,则会返回一个列表;如果...

    m运算符与匹配

    修饰符 含义
    i 关闭大小写敏感性
    m 将字符串作为多行处理
    o 只编译模式一次。用于优化搜索流程
    s 嵌入换行符时,将字符串作为单行处理
    x 允许在正则表达式中提供注释,并忽略空白字符
    g 全局匹配,即查找所有具体值。如果用于数组型上下文语境,则会返回一个列表;如果用于标量型上下文语境,则返回真或假

    s运算符与替换

    格式:

    s/old/new/;
    s/old/new/i;
    s/old/new/g;
    s+old+new+g;
    s(old)/new/; s[old]{new};
    s/old/expression to be evaluated/e;
    s/old/new/ige;
    s/old/new/x;

    替换修饰符

    修饰符 含义
    e 将替换一侧作为表达式来求值
    i 关闭大小写敏感性
    m 将字符串作为多行处理
    o 只编译模式一次。用于优化搜素流程
    s 嵌入换行符时,将字符串作为单行处理
    x 允许在正则表达式中提供注释,并忽略空白字符
    g 全局匹配。即查找所有具体值

    模式绑定运算符

    格式

    Variable = ~ /Expression/
    Variable !~ /Expression/
    Variable =~ s/old/new/

    模式匹配运算符

    示例 含义
    $name =~ /John/ 如果$name含有模式则为真。如果有真,返回1.否则返回空值
    $name !~/John/ 如果$name 不含有模式,则为真
    $name =~s/John/Sam/ 将匹配John的第一个值替换为Sam
    $name =~s/John/Sam/g 将匹配John的所有具体值替换为Sam
    $name =~tr/a-z/A-Z/ 将所有小写字符翻译为大写字符
    $name =~ /\$pal/ 在搜索字符串时使用变量
    展开全文
  • 为了代码的健壮性,if判断条件尽量要多写范围,不要写点...re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None   re.search匹配整个字符串,返回第一次成功的匹配对象,如果...

    为了代码的健壮性,if判断条件尽量要多写范围,不要写点:

    如果判断大于100:

    尽量写成If sum >=100:  

    不要写 if sum ==100:

     

    树不能有环路,有环路的叫做图

     

    正则表达式:

    re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None

     

    re.search匹配整个字符串返回第一次成功的匹配对象,如果匹配失败,则返回None。

    上边两个都是只匹配一次

     

    re.sub()函数用于替换字符串中的匹配项,如果没有匹配的项则字符串将没有匹配的返回。

     

    re.findall() 获取字符串中所有匹配的字符串,并以列表的形式返回

     

    re.compile函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,re.compile(pattern[, flags]) 后边是匹配模式,比如忽略大小写,多行模式等w

    存放的数据如果多用于查询的话用set集合存放比List列表 索引快

     

    sublime在写代码之前一定要在查看(view)中的语法中选择写的是什么类型的代码,好方便sublime对不同类型的代码进行高亮,写完代码之后一定要保存对应的文件类型后才能运行!

    展开全文
  • 正则表达式 todd@todd-virtual-machine:/usr/share/dict$ egrep "^a.*t$" words  匹配在words中以 ^代表开始,a开头,....(如果没有*代表只匹配一次) todd@todd-virtual-machine:/usr/share/dict$ egre
  • 正则表达式匹配

    2021-05-29 12:19:30
    ‘和’‘的正则表达式。模式中的字符’.‘表示任意个字符,而’‘表示它前面的字符可以出现任意(含0)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与...
  • C#正则表达式匹配小数

    千次阅读 2018-07-02 13:47:55
    个点,点前加\是为了转义,如果不转义的话,个点代表个通配符,也就是任意个字符都会被匹配,所以此处只匹配小数点要加\\d{2}匹配两个数字string strstr = "insert into stu(name,password) values('...
  • 正则表达式匹配   题目: 给你个字符串s和个字符规律p,请你来实现个支持 . 和 * 的正则表达式匹配匹配,要涵盖整个字符串s的,而不是部分字符串。 "." 匹配任意单个字符 "*" 匹配零个或多个前面的那...
  •   正则表达式;提高程序的性能,简化代码,提高代码的可读性,简化对字符串的操作   ... [a] //[]表示这个字符出现一次 ,[a] 表示a出现一次 [ abc ] 表示出现a或b或c出现一次 [^abc] ...
  • 创建语法 varpattern = /test/; 或者varpattern = newRegExp("test"); 可配合使用以下三个标志 ...2) 、g相较于只匹配模式的第一次出现,g标志可以使正则表达式匹配模式的所有实例 3) 、m可以使正...
  • 但笔者对于正则表达式使用上的理解是这样的,仅仅对她的发展历史和使用语法粗略的过了一遍,接下来就是一次一次的使用和记录下和她的每次邂逅。慢慢的,就能在心里勾勒出她最美的一面。 本篇仅记录正则表达式...
  • 给你个字符串 s 和个字符规律 p,请你来实现个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符...
  • Javascript剑指offer52题: 正则表达式匹配 请实现个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意个字符,而’'表示它前面的字符可以出现任意(包含0)。 在本题中,匹配是指字符串...
  • 10.正则表达式匹配

    2020-06-21 10:22:32
    leetcode10:给你个字符串 s 和个字符规律 p,请你来实现个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ‘*’ 匹配零个或多个前面的那个元素 所谓匹配,是要涵盖 整个 字符串 s的,而...
  • 正则表达式匹配 给出个字符串str和正则表达式字符串pattern,求这个字符串是否满足str。这个我就不用动态规划做了,就用普通的方法 主要有.和*两种符号,.表示任何字符,*表示前面的字符可以出现任意。 总体...
  • 正则表达式可用于验证,例如验证信用卡号,用于搜索(即通过复杂的文本匹配)以及将匹配的文本替换为另一个字符串。 它还具有强大的多语言支持-学习一次即可在多种编程语言中使用它。 我见过很少有人对regex有所...
  • 正则表达式

    2018-11-04 21:25:53
    正则表达式 概念及特点 1.概念:记录文本规则的代码 2.特点:语法令人头疼,可读性差; 通用性强,适用于很多编程语言 ...search : 根据正则表达式查找数据(查找一次) findall :使用findall进行查找多个字符 s...
  • 52.正则表达式匹配

    2019-10-05 16:28:54
    题目描述:请实现个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意个字符,而'*'表示它前面的字符可以出现任意(包含0)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串...
  • 例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配由于涉及两种正则表达式匹配,所以关键是需要分清除匹配的所有情况,对于模式串来讲,出现了’.’和
  • 正则表达式中的特殊字符字符 ...对正则表达式功能字符的还原,如”“匹配它前面元字符0或多,/a/将匹配a,aa,aaa,加了”\”后,/a*/将只匹配”a*”。 ^ 匹配一个输入或一行的开头,/^a/匹配”an A”,而不匹配”An
  • 例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”aba”均不匹配思路:由于涉及两种正则表达式匹配,所以关键是需要分清除匹配的所有情况,对于模式串来讲,出现了’.’和
  •      普及下正则表达式, 留着备用 字符 含意 \ 做为转意,即通常在"...后面的字符不按原来意义解释,如/b/匹配字符"...后,/a\*/将只匹配"a*"。 ^ 匹配一个输入或一...
  • 请实现个函数用来匹配包含’.’和’‘的正则表达式。模式中的字符’.’表示任意个字符,而’‘表示它前面的字符可以出现任意(含0)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 930
精华内容 372
关键字:

正则表达式只匹配一次