精华内容
下载资源
问答
  • 号是最少匹配前面一次的意思,加个 = 号就不太清楚了,是最少匹配一次 = 号后面的值的吗? 面了三轮后,告知我待定! 对于面试,我也算是身经百战了,待定的意思我明白,意思就是工作的内容能...

    前言

    不久前出去面试了一下,被问到了一个问题:

    正则表达式 (?=a) 表示什么意思?

    嗯,我花了几秒钟从脑子中检索答案,然后发现对于正则表达式方面的知识有许多地方记不清了!

    so,我的回答是:

    我只知道 ? 号是最少匹配前面一次的意思,加个 = 号就不太清楚了,是最少匹配一次 = 号后面的值的吗?

    面了三轮后,告知我待定!

    对于面试,我也算是身经百战了,待定的意思我明白,意思就是工作的内容能胜任,但我还要看看后面来面试的是不是有比你更好的。

    得到这个结果后,我自己想了一下,是不是我面试中关于这个正则的回答没回答好!

    于是,为了以后出去面试,从一个待定人士变为非你不可,我在自己研究加上请教一些网上朋友后,对于正则表达式有了些许体会。

    写篇文章总结下。

    (?=a) 代表什么意思!

    (?=a)非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。

    还有四个和这个相近的:

    (?!a)非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。
    (?:a)非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。
    (?<=a)非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。
    (?<!a)非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。

    以上是官方的定义,比较难懂,我用自己的理解翻译了一下:

    (?=a) 表示我们需要匹配某样东西的前面。
    (?!a) 表示我们需要不匹配某样东西。
    (?:a) 表示我们需要匹配某样东西本身。
    (?<=a) 表示我们需要匹配某样东西的后面。
    (?<!a) 表示我们需要不匹配某样东西,与(?!a)方向相反。

    我的翻译可能还是不太容易理解,我们用代码来解释一下!

    console.log("我是中国人".replace(/我是(?=中国)/, "rr")) // 输出: 'rr中国人',匹配的是中国前面的'我是'
    
    console.log("我是中国人".replace(/(?!中国)/, "rr")) // 输出:'rr我是中国人'
    
    console.log("我是中国人".replace(/(?:中国)/, "rr")) // 输出:'我是rr人',匹配'中国'本身
    
    console.log("我是中国人".replace(/(?<=中国)人/, "rr")) // 输出:'我是中国rr',匹配的是中国后面的'人'
    
    console.log("我是中国人".replace(/(?<!中国)/, "rr")) // 输出:'rr我是中国人'
    复制代码

    Tips:(?!a)和(?<!a)都是输出的 'rr我是中国人',我的理解是,replace替换的时候匹配得是不包含中国的字符串,但是这个字符串又没有,那么js自动给加前面去了。

    一些正则需要知道的概念

    【分组】:

    如果你想要在正则中重复匹配一个字符串,那么可以用一个 () 号给包起来,官方得说法是指定子表达式,也就是分组!

    用代码解释就是:

    \d{1,3}  // 表示匹配1到3位的数字
    
    (\d{1,3}\.){3}  // 表示匹配三位数字加上一个英文句号,并且把这个分组(也就是这个匹配规则)重复三次
    复制代码

    理解了分组这个概念,再复杂的表达式也可以拆分成几个细的分组来实现。

    【后向引用】:

    用 () 号创建了一个分组后,匹配这个子表达式的文本可以在表达式或其它程序中作进一步的处理。每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

    如果你要重复搜索前面某个分组匹配的文本,可以用 \1 ,含义是,分组1匹配的文本,这种引用方式叫做后向引用。

    用代码解释一下:

    console.log("oh oh , oh my god!".replace(/\b(\w+)\b\s+\1\b/, "rr"))
    
    // 输出:'rr , oh my god!'
    
    // \b 匹配一个单词边界,一侧为单词的字符,另外一侧为非单词字符
    
    // \b(\w+)\b,匹配单词开始处和结束处之间的多于一个的字母或数字
    
    // \s+ 匹配一个或者多个空格
    
    // \1 后向引用,重复一次 
    
    // 如果正则表达式去掉 \1
    
    console.log("oh oh , oh my god!".replace(/\b(\w+)\b\s+/, "rr"))
    
    // 输出:'rroh , oh my god!'
    
    复制代码

    实际使用

    数字格式化

    console.log("1234567890".replace(/\B(?=(?:\d{3})+(?!\d))/g,",")) 
    
    // 输出:'1,234,567,890'
    复制代码

    去除ip地址

    console.log("192.168.0.1".replace(/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/,"rr"))
    
    // 输出:'rr'
    复制代码

    去除字符串中的中文,英文或者数字

    console.log("aaa我是中国人111".replace(/[^u4E00-u9FA5]/g, ""))  // 去除中文,输出:'aaa111'
    
    console.log("aaa我是中国人111".replace(/(\d)\1+/g, ""))  // 去除数字,输出:'aaa我是中国人'
    
    console.log("aaa我是中国人111".replace(/([a-z])\1+/g, "")) // 去除英文,输出:'我是中国人111'
    复制代码

    以下省略一万个实际例子 ...

    正则表达式规则表

    结束

    不研究不知道,一研究,发现正则表达式里面可以玩的东西太多了,篇幅和能力都有限,只能先到这里了,有什么错漏之处欢迎各位大大指出!

    参考:正则 ?<= 和 ?= 用法

    转载于:https://juejin.im/post/5ceb7d9df265da1b8811ba7f

    展开全文
  • 历届试题 对局匹配 问题描述  小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。  小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配...

    历届试题 对局匹配

    问题描述
      小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。
      小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。

    现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, … AN。
      小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)?

    输入格式
      第一行包含两个个整数N和K。
      第二行包含N个整数A1, A2, … AN。

    对于30%的数据,1 <= N <= 10
      对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000

    输出格式
      一个整数,代表答案。

    样例输入
    10 0
    1 4 2 8 5 7 1 4 2 8

    样例输出
    6



    ——分割线——



    分析:
    “最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来”是什么意思?就拿样例数据来说:
    1 4 2 8 5 7 1 4 2 8
    其中有两个1,两个2,两个4,两个8,1个5,一个7
    在这种情况下,最糟的情况就是那些可以匹配的人刚好都只有一个人在线,即此时的情况为:
    1,2,4,8,5,7(在线)
    1,2,4,8(不在线)
    此时本来可以匹配的那些人现在都是“单身”了,亦即不能完成匹配。但是在这种情况下,再多增加一个人(无论是谁),系统都能找到一对可以匹配的人。比如现在2上线了,那么之前就已上线的那个2就能和这个2匹配上并进行一场对局。
    于是得出结论,当1,2,4,8,5,7同时在线时即满足了“最多有n名用户同时在线寻找对手,但是系统却一场对局都匹配不起来”这一条件。

    于是得出结论:
    假设当前所有用户(总人数为n)都上线,其中能组成match场对局
    那么我们待求的答案即为n-match(即,从能完成匹配的match对对局中,将每对中的其中一人人强制下线,那么剩下的人和那些根本不能完成匹配的人即凑成了人数最多的“不能匹配队列”)

    其实这样的分析有一个漏洞,就是在k=0且此时能匹配的人数量>=3时。比如就拿下面的数举例(k=0):
    1 1 1 2
    根据上面的结论,我们的答案为ans=4-1=3
    可实际上,当你从某组对局(1 vs 1)中,强制让某个人下线时,此时剩下的那个1和之前未处理的1就已经能够完成一次匹配了。正确的答案应该是只让某个段位为1的人和那个段位为2的人上线才能满足要求。
    再拿1 1 1 1 2举例
    根据上面的结论,我们的答案为ans=5-2=3
    可实际上是,当你从第一组对局(1 vs 1)中仅让一个1上线,并在第二场对局(1 vs 1)中也仅让一个1上线,那么此时在线的还是有两个1啊,这两个1之间是能够完成匹配的。正确答案也是只让某个段位为1的人和那个段位为2的人上线才能满足要求。
    总结看来,这个限制不再是当k=0时,且在线匹配人数大于等于3。
    而是,只要当k=0时,我们的处理办法就应该是直接将所有相等的,都只保留一个人。
    然后再把这一个人和那些根本无法匹配对手的人相加即为最终的结果。
    注意:其实我们可以把k=0时视为一种特殊情况,即当k=0时,对于某个段位(比如上面的1),我们令match等于“这个段位的人的个数”-1,那么此时,上面的那个公式answer=n-match仍然是可以使用的。

    接下来验证下k!=0时的情况,假设序列如下,k=1:
    1 2 3 4 5 6 7 9
    显然这里面人最多的情况下为:1 3 5 7 9(5人)
    带公式ans=8-3=5成立。带之前的逻辑就是:首先在可以匹配的队伍中随机去掉其中一个,然后求出match,然后直接套用n-match即得到结果(当然,在实际情况下,为了满足人数尽量多,我们采取的策略应该是等间距取一个人使其下线。比如在1 2 3 4这一段里面,如果你真的是随便取,假设你取1、4下线,那么剩下的2、3在线,其仍然满足|2-3|=1,是能够匹配的,但是如果我们取1,3,剩下的2,4是不能匹配的。所以对于我们的策略而言,在采用最优办法的时候,上面的公式是成立的)

    基于这样的一种思路,我们可以在录入数据的时候,统计每个段位的玩家的个数(如,段位为i的玩家的个数为x,则应该表达为count[i]=x),然后再在一个for循环中遍历所有段位的玩家的信息
    在这个for循环中,如果输入的k是非0的,那么根据上面的理论,我们就应该把这个段位的玩家与相差k段位的玩家去掉,然后变量match++。
    即count[i]–且count[i+k]–,然后match++
    如果输入的k为0,即代表相等段位才能匹配,那么根据前面的分析我们知道,要求在线人数最多的前提下且没任何人可匹配,那你必须在这每个段位的人中,均只保留一个人。即match=count[i]-1,count[i]=1

    最后依然是输出n-match即可,此即为最终的答案


    ——分割线——


    下面给出本题的完整代码:

    #include<iostream>
    using namespace std;
    
    const int MAX=100010;
    int count[MAX];
    
    int main()
    {
    	int n,k,maxn=0;				//maxn是为了能定位出对某次
    	cin>>n>>k;
    	for(int i=0;i<n;i++){
    		int temp;
    		cin>>temp; 
    		count[temp]++; 
    		maxn=maxn>temp?maxn:temp;
    	} 
    	int match=0;
    	for(int i=0;i+k<=maxn;i++)
    	{
    		while(k && count[i] && count[i+k]){
    			match++;			//k如果不为0,那么对这每两个人中只需要留下一个 
    			count[i]--;
    			count[i+k]--;
    		}
    		while(!k && count[i]>=2){//k如果为0,那么对于同一段位的人而言只需要留下一个人 
    			match+=count[i]-1;
    			count[i]=1;
    		}
    	}
    	cout<<n-match<<endl;
    	return 0;
    }
    
    展开全文
  • LeetCode 通配符匹配

    2018-08-28 13:42:46
    一开始没有意思到这是到动态规划的题目,走了很多弯路,其实很容易想出来 只有三种转移条件 ’?’ 匹配 单个字符, 单个字符匹配单个字符 ‘*’ 号匹配零个字符 ‘*’号匹配两个以上个字符 Python代码 ...

    LeetCode 通配符匹配

    原题链接地址

    • 解题说明

      一开始没有意思到这是到动态规划的题目,走了很多弯路,其实很容易想出来

      只有三种转移条件

      1. ’?’ 匹配 单个字符, 单个字符匹配单个字符
      2. ‘*’ 号匹配零个字符
      3. ‘*’号匹配两个以上个字符
    • Python代码

      class Solution(object):
        def isMatch(self, s, p):
            """
            :type s: str
            :type p: str
            :rtype: bool
            """
            #典型的动态规划
            dp = [ [False for i in range(len(s) + 1)] for i in range(len(p) + 1)]
      
            dp[0][0] = True
      
            for i in range(1, len(dp[0])):
                dp[0][i] = False
      
            for i in range(0, len(dp)):
                for j in range(0, len(dp[0])):
                    if i == 0: continue
      
                    if p[i-1] == '*':
                        # '*'号匹配一个字符
                        if j > 0 and dp[i][j-1]:
                            dp[i][j] = True
      
                        # '*'号匹配零个字符
                        if i > 0 and dp[i-1][j]:
                            dp[i][j] = True
                    else:
                        if i > 0 and j > 0:
                            if dp[i-1][j-1] and (p[i-1] == s[j-1] or p[i-1] == '?'):
                                dp[i][j] = True
      
            return dp[len(p)][len(s)]
    展开全文
  • 每个匹配模式都需要解释清楚,那 /g 是什么意思呀?谢谢。 还有str.replace(/^\s*(.*?)[\s\n]*$/g, '$1')的$1'是什么意思? 答:g全称是global(全部),作用是打开全局匹配,$1 等于前面匹配的()中的内容 补充知识...

    如题,需要详细解释!每个匹配模式都需要解释清楚,那 /g 是什么意思呀?谢谢。

    还有str.replace(/^\s*(.*?)[\s\n]*$/g, '$1')的$1'是什么意思?

    答:g全称是global(全部),作用是打开全局匹配,$1 等于前面匹配的()中的内容

    补充知识:

    i:代表不区分大小写匹配。 英文是ignore(忽略),表明在被查找的字符串中匹配样式的时候查找操作将不区分大小写。
    m:代表可以进行多行匹配。 英文是multiple(多选),标志在多行的字符串中进行查找

    第一个^表示从你要查找的字符串的第一位开始匹配比如123 正则为1 那么这里123的1 就匹配这个正则。。如果是213 这里213里面的1 就不匹配这个正则 \s 包括空格、制表符、换页符等空白字符的其中任意一个后面跟个*表示 可以匹配0-N次,(.*?)这个小括号里面的“.”小数点可以匹配除了换行符(\n)以外的任意一个字符而后面跟*也是说的 可以匹配0-N次后面的[\s\n]*表示这里匹配一个字符而这个字符只能是\s或者\n里面的 \n表示回车和换行符,*就不多说了 最后$表示正则匹配的结束,这个与^合起来用。,也就是说 这个匹配的字符串 必须以\s\n里面包含的字符结束
    这个JS函数的作用就是正则替换。。符合正则条件的就替换成$1


    展开全文
  • Python使用正则匹配过滤的面试

    千次阅读 2018-12-02 20:44:46
    面试: 字符串a = "not 404 found 张三 99 深圳",每个词中间是空格,用正则过滤掉英文和数字,最终输出"张三 深圳" 常规思路: 先将字符串转变成列表,根据正则匹配到数字和英文字符,然后从...
  • 题目: 给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和'*'的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。 说明...
  • 文章目录第十——正则表达式匹配题目要求示例我的思路优秀解法差别分析 第十——正则表达式匹配 题目要求 给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个...
  • 括号匹配

    2019-08-28 10:58:36
    ###括号匹配 ...####分析 这个题目很多同学都见过了,如果没有后面的条件,会张口就说就来用栈来实现,时间复杂度O(n),空间复杂度O(n)。这个是很好的一个解答,没有问题的。但是我们在做面试,准备...
  • 即先从左部中选出一个端点,去匹配右部,如果可以匹配且被匹配端点没有被匹配过,那么直接将两个点进行配对,如果被匹配端点已经被匹配过了,那么就尝试“协商”,协商的意思是指尝试将被匹配端点的匹配端点进行再次...
  • 解题报告 (九) 二分图最大匹配

    万次阅读 2021-01-16 21:00:13
    二分图最大匹配题集-全网最全
  • 正则表达式匹配

    2021-04-27 08:16:26
    题目 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一...首先理解一下题目意思 “.”表示可以匹配任意一个字符,“x*”表示*前面的x字符可以重复0次或者任意多次。 设字符串为str,匹配
  • 括号匹配问题 - 九度教程第26 题目 时间限制:1 秒 内存限制:32 兆 特殊判:否 题目描述: 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内...
  • 阻抗匹配

    千次阅读 2016-07-20 14:51:48
    阻抗匹配 阻抗匹配是指在能量传输时,要求负载阻抗要和传输线的特征阻抗相等,此时的传输不会产生反射,这表明所有能量都被负载吸收了。反之则在传输中有能量损失。...PCB走线什么时候需要做阻抗匹配? 不主要看
  • 校招笔试中关于括号匹配的问题,一次总结个够! 完成括号匹配 合法的括号匹配序列被定义为: 1. 空串""是合法的括号序列 2. 如果"X"和"Y"是合法的序列,那么"XY"也是一个合法的括号序列 3. 如果"X"是一个合法的...
  • 数据库中根据相似度匹配相似题目

    千次阅读 2018-08-07 19:48:52
    # -*- coding: utf-8 -*- """ Created on Mon Feb 5 13:41:23 2018 @author: loka """ import pandas as pd import pymysql import pymysql as mdb ...#连接数据库...
  • 意思就是把所有的必要匹配输出,但是貌似没说必须是满的匹配 所谓必要匹配在本中的意思就是,在所有的最大匹配中,1个数字都会匹配到同一个字母上去。那么这个数字和字母的匹配就是必要匹配了 使用的方法...
  • 题目意思: p门课,n个学生,每一门课都有若干学生可以当代表。当然,每一个学生最多只能是一门课的代表。 问:能否为每一门课都选出一个学生当代表。 本要点: 1、二分图最大匹配: 左部节点:课程的编号; 右部...
  • 题目的主要意思是:合法的括号匹配序列要求每一个左括号都必须要有一个右括号与之完成配对,像“(((())”和"()((()"就不是合法的,而"((()))","()()()"就是合法的序列.现求是否能通过...
  • 一、题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是...
  • 括号匹配详解

    2017-11-15 19:10:00
    括号匹配详解 今天带来的是括号匹配算法。 题目描述 用顺序存储实现栈的初始化、入栈、出栈、取栈顶、判栈空操作。调用以上操作实现判断从键盘输入的括号序列是否匹配。 输入 括号序列 输出 ...
  • replace(/\s/g,"")中的/g是什么意思?

    万次阅读 2013-07-30 14:34:53
    每个匹配模式都需要解释清楚,那 /g 是什么意思呀?谢谢。 还有str.replace(/^\s*(.*?)[\s\n]*$/g, '$1')的$1'是什么意思? 答:g全称是global(全部),作用是打开全局匹配,$1 等于前面匹配的()中的内容 补充知识...
  • 在Q群里聊到关于规则生成的问题,有个这样的题目: 在基于自然语言的人机交互系统中,通常会定义一些语义模板来训练NLU (自然语言理解)模型,比如下面的模板可以支持用户通过语音控制机器播放音乐: 放几首@{singer...
  • 一模一样的 !!! http://www.cnblogs.com/tbt123/p/6920729.html 题目:有一个合法的字符串,合法是指左括号与右括号全部能配对,现在每次将这个序列第一个左括号删去,在将任意一个右括号删去,每次删去后的序列...
  • 二分图匹配详解

    千次阅读 2017-07-31 21:55:58
    二分图匹配二分图的原始模型及相关概念 二分图的匹配 最大匹配 完全匹配 最佳匹配 最佳完备匹配 一般图最大匹配 求解二分图最大匹配 网络流算法 匈牙利算法 常见模型 三个重要等式 例题 poj3041求最小点覆盖 poj1422...
  • 经过两天的课设+考试,终于有时间继续看书了,今天记录一道面试“正则表达式的匹配”。 问题描述:请实现一个函数用来匹配包含’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,822
精华内容 19,528
关键字:

匹配题是什么意思