71 字符串通配符

部署运行你感兴趣的模型镜像

题目描述
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写。下同)
?:匹配1个字符

输入:
通配符表达式;
一组字符串。

输出:
返回匹配的结果,正确输出true,错误输出false

输入描述:
先输入一个带有通配符的字符串,再输入一个需要匹配的字符串

输出描述:
返回匹配的结果,正确输出true,错误输出false

示例1
输入
te?t*.*
txt12.xls
输出
false
思路:利用正则表达式

import re
while True:
    try:
        pattern=input().strip()
        string=input().strip()
        newpattern=pattern.replace('.','\\.').replace('*','[A-Za-z0-9]*').replace('?','.')#新的pattern
        if re.match(newpattern,string):
            print('true')
        else:
            print('false')
    except:
        break

递归解法

递归解法,假设string1是带有通配符的字符串,string2是要匹配的字符串,在第i个字符处有三种
情况:
1、两个字符串都是字母的时候,不相等就是false;
2、遇到?通配符的时候,跳过第i个字符,继续匹配从string1[i+1],string2[i+1]开始匹配;
3、遇到“*”通配符,则遍历后面的字符串,根据情况在进行判断;

def isMatch(string1, string2):
    for i in range(len(string1)):
        if string1[i].isalpha():
            if string1[i] != string2[i]:
                return 'false'
        else:
            if string1[i] == "?":
                isMatch(string1[i + 1:], string2[i + 1:])
            elif string1[i] == "*":
                for j in range(i + 1, len(string1)):
                    if string1[j] == '?' or string1 == "*":
                        isMatch(string1[j:], string2[j:])
                    elif string1[j].isalpha() and string2.isalpha():
                        if string1[j] == string2[j]:
                            isMatch(string1[j:], string2[j:])
    return 'true'
 
while True:
    try:
        string1 = input()
        string2 = input()
        print(isMatch(string1, string2))
    except:
        break

JAVA直接利用字符串matches(regex),同样修改regex的表达式为符合原条件的regex

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            String reg=in.nextLine();
            String str=in.nextLine();
            reg=reg.replace(".","\\.");
            reg=reg.replace("?","[0-9A-Za-z]?");
            reg=reg.replace("*","[0-9A-Za-z]*");
            System.out.println(str.matches(reg));
        }
    }
}

利用动态规划
参考http://www.mamicode.com/info-detail-986984.html

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            String reg=in.nextLine();
            String str=in.nextLine();
            int m=reg.length();
            int n=reg.length();
            boolean[][] dp=new boolean[m+1][n+1];//默认初始为false;
            dp[0][0]=true;
            for(int i=1;i<=m;i++){
                dp[i][0]=dp[i-1][0]&& (reg.charAt(i-1)=='*');//除第一个字符为*外,其他与str为空匹配都为false
            }
            for(int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                    if(reg.charAt(i-1)=='*')//通配符为*,则为0个dp[i-1][j]/多个dp[i][j-1]
                        dp[i][j]=dp[i-1][j]||dp[i][j-1];
                    else//其他
                        dp[i][j]=dp[i-1][j-1]&&(reg.charAt(i-1)==str.charAt(j-1)||reg.charAt(i-1)=='?');
                }
            }
            System.out.println(dp[m][n]);
        }
    }
}
while True:
    try:
        pattern=input().strip()
        string=input().strip()
        m=len(pattern)
        n=len(string)
        dp=[[False for j in range(n+1)] for i in range(m+1)]
        dp[0][0]=True
        for i in range(1,m+1):
            dp[i][0]=dp[i-1][0] and (pattern[i]=="*")
        for i in range(1,m+1):
            for j in range(1,n+1):
                if pattern[i-1]=="*":
                    dp[i][j]=dp[i-1][j]or dp[i][j-1]
                else:
                    dp[i][j]=dp[i-1][j-1] and (pattern[i-1]==string[j-1] or pattern[i-1]=="?")
        if dp[-1][-1]:
            print("true")
        else:
            print("false")
    except:
        break

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要回答用户关于VBA字符串通配符的问题。首先,我得确认自己对这方面知识是否足够熟悉。VBA中的通配符主要用于字符串比较,特别是在Like运算符中。常见的通配符包括星号*、问号?、井号#,还有方括号[]用于范围匹配。不过,可能还有其他需要注意的地方,比如转义字符或者特殊用法。 接下来,我应该整理这些通配符的具体用法和例子,确保每个符号都有清晰的解释和示例。例如,星号匹配任意多个字符,问号匹配单个字符,井号匹配一个数字,方括号可以指定范围或排除。另外,可能需要提到转义字符的使用,比如用方括号括住通配符本身来匹配原字符,比如[?]匹配问号。 然后,需要考虑用户可能的实际应用场景,比如在字符串搜索、数据验证或模式匹配中使用这些通配符。因此,给出实际代码示例会很有帮助,比如使用Like运算符的If语句或循环中的条件判断。 还要检查是否有常见的错误或误解,例如通配符与其他编程语言中的正则表达式混淆,需要指出VBA中的通配符和正则表达式的区别,避免用户混淆。同时,提醒用户注意Like运算符的大小写敏感性,可能在某些情况下需要处理大小写问题。 最后,确保回答结构清晰,分点说明每个通配符的用途,并附上示例代码,方便用户理解和应用。需要验证每个例子是否正确,避免语法错误,比如确保代码中的字符串比较正确使用了Like运算符和正确的通配符格式。另外,可能需要提到转义字符的使用方法,例如如何匹配特殊字符本身,如*或?,这时需要用方括号括起来。 总结一下,回答需要包括以下几点: 1. VBA通配符的用途和Like运算符的关系。 2. 各个通配符的详细解释和示例。 3. 转义字符的使用方法。 4. 实际代码示例。 5. 注意事项和常见问题,比如大小写敏感性和与正则表达式的区别。 检查是否有遗漏的信息,例如是否提到了字符列表中的连字符-用于范围,比如[A-Z],或者排除符号!的使用。同时,是否需要说明通配符的组合使用,例如多个通配符一起使用的情况,如“a*[0-9]”匹配以a开头,后跟任意字符并以数字结尾的字符串。 确保语言简洁明了,用中文表达,避免技术术语过于晦涩,让不同水平的用户都能理解。最后,通读整个回答,确保符合用户的要求,结构清晰,示例正确,并且覆盖了所有关键点。</think>在VBA中,**字符串通配符**主要用于`Like`运算符进行模糊匹配。以下是常见通配符及其用法详解: --- ### 一、核心通配符列表 1. **`*`(星号)** - **功能**:匹配任意数量(包括零个)的字符。 - **示例**: ```vba If "Hello World" Like "H*" Then &#39; True,匹配以H开头的字符串 If "VBA" Like "*A*" Then &#39; True,匹配包含A的字符串 ``` 2. **`?`(问号)** - **功能**:匹配单个任意字符。 - **示例**: ```vba If "Cat" Like "C?t" Then &#39; True,匹配C开头、t结尾的3字符字符串 If "Dog" Like "D??" Then &#39; False,需要D后跟2个字符(如"Dogg"才为True) ``` 3. **`#`(井号)** - **功能**:匹配单个数字(0-9)。 - **示例**: ```vba If "A1" Like "A#" Then &#39; True,匹配A后跟一个数字 If "B23" Like "B##" Then &#39; True,匹配B后跟两个数字 ``` 4. **`[ ]`(方括号)** - **功能**:匹配指定范围内的单个字符。 - **示例**: ```vba If "F" Like "[A-F]" Then &#39; True,匹配A到F之间的字符 If "5" Like "[0-9]" Then &#39; True,匹配数字 ``` 5. **`[! ]`(排除范围)** - **功能**:匹配不在指定范围内的单个字符。 - **示例**: ```vba If "G" Like "[!A-F]" Then &#39; True,G不在A-F范围内 ``` --- ### 二、特殊字符转义 若需匹配通配符本身(如`*`、`?`、`#`),需用方括号包裹: ```vba If "File?" Like "File[?]" Then &#39; True,匹配结尾为?的字符串 If "10*" Like "10[*]" Then &#39; True,匹配结尾为*的字符串 ``` --- ### 三、组合使用示例 - **复杂模式**: ```vba If "Data123" Like "D*###" Then &#39; True,D开头后接任意字符,并以3个数字结尾 If "User_5" Like "User[_]#" Then &#39; True,匹配User_后跟一个数字 ``` - **范围与排除**: ```vba If "Apple" Like "[A-C]???[!0-9]" Then &#39; False,首字母A在A-C范围内,但结尾非数字 ``` --- ### 四、注意事项 1. **大小写敏感**: VBA默认不区分大小写,但受`Option Compare`语句影响。若需区分,添加`Option Compare Binary`。 2. **通配符 vs 正则表达式**: VBA通配符功能有限,复杂匹配需使用`VBScript.RegExp`(正则表达式)。 --- 通过`Like`运算符和通配符,可高效实现字符串模式匹配,适用于数据筛选、格式验证等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值