C/C++中的字符串模糊匹配

需求:

准入授权配置文件有时候分了好几个维度进行配置,例如 company|product|sys这种格式的配置:

1.配置 "sina|weibo|pusher" 表示 sina公司weibo产品pusher系统能够准入,而"sina|weibo|sign"不允许准入

2.配置 "sina|*|pusher” 表示sina公司所有产品的pusher系统都能够准入

3.配置 “*|*|pusher” 表示所有公司的所有产品的pusher系统都能够准入

类似还有很多场景,好了,简单的东西不扯蛋了.

实现:

面对这个需求我第一时间想的是如何设计模式串,如何快速实现功能,因为我现在写的是一个C服务,所以我首先出现在我脑海的是一大堆 strchr(XXX, ‘*’), strchr(XXX, ‘|’)等等东西,后面发现这个东西没有必要自己造轮子,有现成的函数可以用,那就是fnmatch.

google了一下,发现fnmatch的资料并不是很多,大部分还都是讲php函数的,所以没办法,只能自己写写测测了.

#include <iostream>
#include <fnmatch.h>
#include <vector>
using namespace std;  

int main()
{
    const char* orgin_str = "sina|weibo|pusher";
    char pattern_arr[][20] = {
        {"sina|*|pusher"},
        {"sina|*|*"},
        {"*|weibo|*"},
        //不能被匹配的
        {"sina|pic|*"},
        {"*|*|sign"},
        {"*|weibo|sign"},
        {"*|pic|sign"},
        {"sina|pic|sign"},  

        {"*|*|*"}
    };
    static int pattern_arr_size = sizeof(pattern_arr) / sizeof(pattern_arr[0]);  

    vector<char *> vec_str;
    for(int i = 0; i < pattern_arr_size; i ++)
    {
        vec_str.push_back(pattern_arr[i]);
    }  

    int ret;
    int z = 0;
    while(z < 1){
        for(int i = 0; i < vec_str.size(); i++)
        {
            ret = fnmatch(vec_str.at(i), orgin_str, FNM_PATHNAME);
            if(FNM_NOMATCH == ret){
                cout<<"sorry I'm failed ["<< vec_str.at(i) <<"]"<<endl;
            }
        }
        ++z;
    }
}

结果:

实验一把,结果还不赖,完全满足需求:

需求满足了,我担心的还有一个问题,那就是性能,注释掉cout输出,将while z语句调至1,000,000,重新编译跑一下:

time ./fnmatch

看来效率还不错,2.1s 进行了100W次匹配,平均2us一次,性能要求也满足了...

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 配置
, pusher
, sina
, 准入机制
Weibo
c字符串模糊匹配、js模糊匹配字符串、字符串模糊匹配、java模糊匹配字符串、php模糊匹配字符串,以便于您获取更多的相关知识。

时间: 2024-10-09 00:27:13

C/C++中的字符串模糊匹配的相关文章

C/C++实现字符串模糊匹配_C 语言

需求: 准入授权配置文件有时候分了好几个维度进行配置,例如 company|product|sys这种格式的配置: 1.配置 "sina|weibo|pusher" 表示 sina公司weibo产品pusher系统能够准入,而"sina|weibo|sign"不允许准入 2.配置 "sina|*|pusher" 表示sina公司所有产品的pusher系统都能够准入 3.配置 "*|*|pusher" 表示所有公司的所有产品的p

java在多个字符串里匹配

问题描述 java在多个字符串里匹配 每当我得到一个字符串我要和5000多个字符串去匹配寻找相同的, 可以把5000多个字符串做成文件在java里通过流读取匹配吗,或者有更好的方法吗, 解决方案 最好的办法是做倒排索引,搜索引擎的全文搜索就是这么实现的. 解决方案二: 例子http://download.csdn.net/detail/a1298071341/3335929 解决方案三: 可以放到文件中: 也可以把5000个字符串放到数据库中,然后判断是否存在数据库里 解决方案四: 5000个字

IOS实现邮箱模糊匹配的功能_IOS

先来看看要实现的效果图 一.介绍一下功能 当输入一个邮箱的数字,会默认在后面匹配出来@qq.com,当然这个默认@qq.com可以换成其他的如@163.com等等.这里默认是@qq.com,因为我们的产品汪做过统计大多数用户还是用的qq邮箱,所以默认是@qq.com. 当输入@符号还是不会有所变化,但是如果在@之后再输入字符,会将这个字符和你想要提示的邮箱后缀做匹配,我这里是需要匹配@qq.com,@163.com,@126.com,@yahoo.com,@139.com,@henu.com类型

sql中生成查询的模糊匹配字符串_MsSql

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_Sql]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[f_Sql] GO if exists (select * from dbo.sysobjects where id = object_id(N'[序数表]') and OBJECTPROPERTY(id, N'IsUserTa

sql中生成查询的模糊匹配字符串

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_Sql]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[f_Sql] GO if exists (select * from dbo.sysobjects where id = object_id(N'[序数表]') and OBJECTPROPERTY(id, N'IsUserTa

php中如何用preg_match_all匹配字符串

问题描述 php中如何用preg_match_all匹配字符串 <div class="Wrapper"> <div class="colImg"> <a href="http://store.shopping.yahoo.co.jp/matsunami/fcdm3.html"></a> </div> <div class="wrCol cf"> <

JavaScript中两个字符串的匹配_javascript技巧

工作中遇到一个问题,两个字符串匹配,要求:每个字符串中最多含有一个*,?可以无限多个 *代表一个任意长度的字符串,而?则代表一个字符 要求可以提示出两个冲突 复制代码 代码如下: <input type="text" id="str1"><br> <input type="text" id="str2"><br> <input type="button"

c-请问匹配字符串中重复字符串内容的正则表达式怎么写?

问题描述 请问匹配字符串中重复字符串内容的正则表达式怎么写? 匹配字符串中重复的字符串内容的正则表达式 或者匹配不重复的字符串内容? 解决方案 ASP 正则表达式匹配字符串提取正则表达式 字符串完全匹配获取正则表达式匹配的字符串 解决方案二: http://blog.csdn.net/zhulinu/article/details/17148511 解决方案三: 用"+"来表示重复一次或多次,建议看看正则表达式

rowfilter-RowFilter 模糊查询出现:Like 运算符中出错: 字符串模式“2#%门%”无效。

问题描述 RowFilter 模糊查询出现:Like 运算符中出错: 字符串模式"2#%门%"无效. dv = dt.DefaultView; sWhere += string.Format(" AND ( companyUseRange LIKE '{0}%' or GroupUseRange LIKE '%{0}%')", "2#"+par["GroupUseRangeOther"]); dv.RowFilter = sW