带’*’号字符串的匹配

目标:

判断源字符串中是否含有指定子串,子串可能会有*号通配符。

初步测试没问题。记录下来。后面要是有问题再来纠正。

#include <string>
using namespace std;

// 带*号通配符的字符串匹配,‘*‘代表任意字符串,包括空字符串
bool WildcardCaptureA(const char* lpszSour, const char* lpszMatch)
{
    bool lbRet = false;
    do
    {
        const char* lpszSrcStr = lpszSour;
        const char* lpszMatchStr = lpszMatch;

        // 不用比较的条件
        if(NULL == lpszSrcStr || 0 == lpszSrcStr[0]
            || NULL == lpszMatchStr || 0 == lpszMatchStr[0])
            break;

        // 排除首部的*号
        while(‘*‘ == lpszMatchStr[0])++lpszMatchStr;
        if(0 == lpszMatchStr[0])        // 全是*号,则认为任何字符串都匹配
        {
            lbRet = true;
            break;
        }

        string loStrWord;
        // 取出第一个子串
        while(‘*‘ != lpszMatchStr[0] && 0 != lpszMatchStr[0])
        {
            loStrWord.push_back(lpszMatchStr[0]);
            ++lpszMatchStr;
        }

        // 匹配
        lpszSrcStr = strstr(lpszSrcStr, loStrWord.c_str());
        if(NULL == lpszSrcStr)
            break;

        // 继续匹配
        if(0 != lpszMatchStr[0] && false == WildcardCaptureA(++lpszSrcStr, lpszMatchStr))
            break;

        lbRet = true;
    } while (false);
    return lbRet;
}

// 带*号通配符的字符串匹配,‘*‘代表任意字符串,包括空字符串
bool WildcardCaptureW(const wchar_t* lpszSour, const wchar_t* lpszMatch)
{
    bool lbRet = false;
    do
    {
        const wchar_t* lpszSrcStr = lpszSour;
        const wchar_t* lpszMatchStr = lpszMatch;

        // 不用比较的条件
        if(NULL == lpszSrcStr || 0 == lpszSrcStr[0]
        || NULL == lpszMatchStr || 0 == lpszMatchStr[0])
            break;

        // 排除首部的*号
        while(‘*‘ == lpszMatchStr[0])++lpszMatchStr;
        if(0 == lpszMatchStr[0])        // 全是*号,则认为任何字符串都匹配
        {
            lbRet = true;
            break;
        }

        wstring loStrWord;
        // 取出第一个子串
        while(‘*‘ != lpszMatchStr[0] && 0 != lpszMatchStr[0])
        {
            loStrWord.push_back(lpszMatchStr[0]);
            ++lpszMatchStr;
        }

        // 匹配
        lpszSrcStr = wcsstr(lpszSrcStr, loStrWord.c_str());
        if(NULL == lpszSrcStr)
            break;

        // 继续匹配
        if(0 != lpszMatchStr[0] && false == WildcardCaptureW(++lpszSrcStr, lpszMatchStr))
            break;

        lbRet = true;
    } while (false);
    return lbRet;
}

时间: 2024-11-02 11:12:29

带’*’号字符串的匹配的相关文章

java 自己实现字符串的匹配

package com.learn.algorithm.Str; /** * 自己实现 字符串的匹配 * @author Jiekun.Cui * */ public class SString { public static void main(String[] args) { System.out.println(indexOf("china","in",0)); } /** * 字符串匹配算法 -- 查找s2 在s1 中的位置 * @param s1 * @p

老男孩教育每日一题-2017年5月9日-vim命令粘贴带#号或注释信息格式会出现混乱情况怎么办

1.题目 老男孩教育每日一题-2017年5月9日-vim编辑器使用知识点:vim命令粘贴带#号或注释信息格式会出现混乱情况,有什么方法进行解决?问题说明:每次复制代码时,如果代码里有 //或# 这样的注释就容易让格式乱掉,显示的内容不整齐,并不是所期望的显示格式. 2.参考答案 原因分析: 是由于vim编辑命令的自动缩进功能所影响,因此粘贴带注释的代码时可以取消自动缩进 问题解决: vim在粘贴代码时会自动缩进,把代码搞得一团糟糕,甚至可能因为某行的一个注释造成后面的代码全部被注释掉:最初的解决

url带#号,微信支付那些坑

现在前端很多框架的前端路由都带#号,主要为了做到无刷新跳转页面. 在微信公众号做微信支付时,配置的支付路径比如是http://www.eee.com/#/order,在调微信支付的方法时错误信息是'URL未注册'. 我的解决方案是,写一个专门做为微信支付的页面,ajax请求后台返回需要调取微信支付的数据(签名等信息),然后把这些信息暂存起来(可以用h5的缓存,记得支付完清掉,如果用node,可以用node的缓存,以自己的实际项目方便).跳转到支付的页面 <!DOCTYPE html><h

字符串的匹配

字符串的匹配 时间限制: 1 Sec  内存限制: 128 MB 题目描述 相信大家都做许多的字符串匹配问题了,一天,503集训室的俊哥突然想出了新点子.现在给你两个字符串a,b求最长公共子串.对于是字符串匹配大师的你来说,这个再简单不过了.但是,如果现在你有k次修改机会,每次你都可以选择其中某个串的某个位置.将其修改成任意字符. 你需要合理使用这k次修改机会,使得修改后字符串的最长公共子串最长.相信这个对于你来说也很简单. 输入 题目中有多组数据,每组数据的第一行为一个整数k.表示修改次数.

3度带、6度带带号与中央经线

通过分带计算,我们可以知道某地的中央经线所在的分度代号. 在分度带的投影坐标系统中,我们常用的投影方法是 "高斯-克吕格"投影.6度带自0度子午线起每隔经差6度自西向东分带,带号依次编为第 1.2…60带;3度带自1.5度子午线起每隔经差3度自西向东分带,带号依次编为三度带第 1.2…120带. 6度分带和6度分带划分图示为: 分度代号计算: 3度分带:N = L/3 6度分带:N = (L+3)/6 中央经线计算: 3度分带:L = N*3 6度分带:L = N*6-3 通常,1:1

C++实现的字符串模糊匹配

C++基本没有正则表达式功能,当然像Boost里提供了正则.本文来源于博客园园友的一篇文章,请看: C/C++ 字符串模糊匹配 很早之前就看过这篇文章,原作者的需求很明确.代码实现也很好. 之所以又写这篇文章,是因为原作者只介绍了在Linux系统下直接调用系统函数fnmatch即可实现,而没有考虑在Windows在的使用. 本人这周看了下Google-glog代码,恰巧发现了一个类似fnmatch的简单实现,因此综合起来提供了一个跨平台的接口. 直接拿原作者的需求为例(再次感谢原作者大熊先生,我

java.sql.SQLException:ORA-01861:文字和格式字符串不匹配

1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接SQL语句时传参数却是字符串类型,类型不匹配,导致出错 3.解决办法 (1)修改数据库中该字段的数据类型 这种方法不太建议 (2)修改拼接时传参数方式,将参数利用to_date转换

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

Oracle添加数据报文字与格式字符串不匹配错误

今天在学习Oracle时碰到一个错:文字与格式字符串不匹配. 我在Oracle数据库中创建了一张表: --创建员工表employee create table employee ( empon number(4) not null,--员工编号 ename varchar2(10),--员工姓名 job varchar2(9),--员工工种 mgr number(4),--上级经理编号 hiredate date,--受雇日期 sal number(7,2),--员工薪水 comm number