如何判断两个带通配符的字符串是否相等

MagicFuzzX 2012-07-29 11:52:32
通配符包括:*(表示0-N个字符),?(表示一个字符)

比如:*abcd == ?abcd*
...全文
487 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
MagicFuzzX 2012-08-01
  • 打赏
  • 举报
回复
自己顶下~~
  • 打赏
  • 举报
回复
比如
普通字符串*abcd (星号表示普通字符)
带通配符的?abcd*(问号表示一个字符,星号表示任意个字符)

先把?abcd* 转为 ^.abcd.*$ (^表示开始.表示任意字符 .*表示任意个字符 $表示结束)

然后用^.abcd.*$构造一个正则表达式

最后调用regex_match 返回true表示能匹配,也就是相等;false表示不等
MagicFuzzX 2012-07-30
  • 打赏
  • 举报
回复
楼主决定求一个带通配符的和普通字符串比较的C++实力代码
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

:*abcd == ?abcd* 比较没有什么意思的

通配符与普通字符的比较
采用正则表达式


嗯,这正则怎么写?
[/Quote]
我分析了三层,不知道楼主到底要问什么:
1.两个普通字符串的比较(没意思)
2.一个普通字符串用正则匹配,其中的那个普通字符串带通配符(也没意思,正则而已,匹配特殊字符加转移就行)
3.两个正则表达式,拿任意字符串去测试,结果都一样,说明两个正则一样(太有意思了,但我不会,因为太复杂了,哈哈)
MagicFuzzX 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

引用 18 楼 的回复:
引用 17 楼 的回复:

楼主是讨论理论问题呢,还是解决一个实际的问题。引入正则的概念有些复杂。


解决实际问题,就是一个带通配符的和普通字符串比较,而且只需要*和?

如果只需要*,?可以自己直接处理字符串.
[/Quote]

麻烦给个例子,我这里纠结了很久了,没写出来。。
oyljerry 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
引用 17 楼 的回复:

楼主是讨论理论问题呢,还是解决一个实际的问题。引入正则的概念有些复杂。


解决实际问题,就是一个带通配符的和普通字符串比较,而且只需要*和?
[/Quote]
如果只需要*,?可以自己直接处理字符串.
MagicFuzzX 2012-07-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

楼主是讨论理论问题呢,还是解决一个实际的问题。引入正则的概念有些复杂。
[/Quote]

解决实际问题,就是一个带通配符的和普通字符串比较,而且只需要*和?
fronz 2012-07-30
  • 打赏
  • 举报
回复
楼主是讨论理论问题呢,还是解决一个实际的问题。引入正则的概念有些复杂。
赵4老师 2012-07-30
  • 打赏
  • 举报
回复
//摘自《代码之美》
// 字符 含义
// . 匹配任意的单个字符
// ^ 匹配输入字符串的开头
// $ 匹配输入字符串的结尾
// * 匹配前一个字符的零个或者多个出现
#include <stdio.h>
int matchhere(char *regexp, char *text);

int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of text
do {// a * matches zero or more instances
if (matchhere(regexp, text)) return 1;
} while (*text != '\0' && (*text++ == c || c == '.'));
return 0;
}
int matchhere(char *regexp, char *text) {// matchhere: search for regexp at beginning of text
if (regexp[0] == '\0') return 1;
if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);
if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';
if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);
return 0;
}

int match(char *regexp, char *text) {// match: search for regexp anywhere in text
if (regexp[0] == '^') return matchhere(regexp+1, text);
do {// must look even if string is empty
if (matchhere(regexp, text)) return 1;
} while (*text++ != '\0');
return 0;
}
void main() {
printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));
printf("%d==match(^a ,abc)\n",match("^a" ,"abc"));
printf("%d==match(c$ ,abc)\n",match("c$" ,"abc"));
printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));
printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));
printf("-------------------\n");
printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));
printf("%d==match(^B ,abc)\n",match("^B" ,"abc"));
printf("%d==match(A$ ,abc)\n",match("A$" ,"abc"));
printf("%d==match(a..c,abc)\n",match("a..c","abc"));
printf("%d==match(a.*d,abc)\n",match("a.*d","abc"));
}
//1==match(abc ,abc)
//1==match(^a ,abc)
//1==match(c$ ,abc)
//1==match(a.c ,abc)
//1==match(a.*c,abc)
//-------------------
//0==match(ABC ,abc)
//0==match(^B ,abc)
//0==match(A$ ,abc)
//0==match(a..c,abc)
//0==match(a.*d,abc)
lgxing 2012-07-29
  • 打赏
  • 举报
回复
把通配符都去掉再比就行了
MagicFuzzX 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

正则表达式?
[/Quote]怎么写。。正则没玩过。。正则会不会影像效率?
Eleven 2012-07-29
  • 打赏
  • 举报
回复
正则表达式?
gibsonboy 2012-07-29
  • 打赏
  • 举报
回复
先转过来再比较行不行呢?
ToperRay 2012-07-29
  • 打赏
  • 举报
回复
太变态的需求,哪有这么比较的。
  • 打赏
  • 举报
回复
http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html
傻X 2012-07-29
  • 打赏
  • 举报
回复
我以前也觉得很变态这个问题。给个列子是以前某大神写的。
abcdab1234 format为 %sab%s34 %为不确定,输出%s内容


#include "stdafx.h"
#include "memory.h"
#include "string.h"

int main(int argc, char* argv[])
{
char ori[] = "abcdab1234";
char format[] = "%sab%s34%s";

char *p = format;
char tmp[ 20 ][ 20 ];
int count;
int len;
int i;

memset( tmp, 0, sizeof( tmp ) );

count = 0;
len = 0;

while( *p )
{
if( '%' == *p )
{
if( p != format )
{
count++;
}
len = 0;
tmp[ count ][ len++ ] = '%';
p++;
tmp[ count ][ len++ ] = *p;
len = 0;
if( *p )
{
count++;
}
}
else
{
tmp[ count ][ len++ ] = *p;
}
p++;
}
count++;

for( i = 0; i < count; i++ )
{
printf( "format part %d is --- %s \r\n", i + 1, tmp[ i ] );
}

char *q = ori;
for( i = 0; i < count; i++ )
{
if( !strcmp( tmp[ i ], "%s" ) )
{
char *t = strstr( q + 1, tmp[ i + 1 ] );
char dest[ 0x10 ] = "";
memcpy( dest, q, ( int )( t - q ) );
printf( "the %%s is %s \r\n", dest );
q += strlen( dest );
q += strlen( tmp[ i + 1 ] );
}
}

return 0;
}




MagicFuzzX 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

:*abcd == ?abcd* 比较没有什么意思的

通配符与普通字符的比较
采用正则表达式
[/Quote]

嗯,这正则怎么写?
贪玩的老鼠 2012-07-29
  • 打赏
  • 举报
回复
:*abcd == ?abcd* 比较没有什么意思的

通配符与普通字符的比较
采用正则表达式
MagicFuzzX 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

一般是一个普通字串和一个带通配符的比较。
你这个怎么是2个通配的串比较,这样有问题吧
[/Quote]

额,那带通配符的跟普通字符串怎么比较。。。
3m2u 2012-07-29
  • 打赏
  • 举报
回复
一般是一个普通字串和一个带通配符的比较。
你这个怎么是2个通配的串比较,这样有问题吧
一、网页设计与策划01 网页与网站的概念02 网页核心技术(HTML/CSS/JAVASCRIPT)简介03 什么是HTML04 什么是CSS05 什么是JavaScript06 网页的设计流程07 HTML5概述、浏览器及内核08 编写第一个HTML页面09 HTML页面基本结构10 章节练习二、网页的基本实现(HTML标签)01 HTML基本语法02 标签及属性03 标签04 标题标签05 段落标签06 水平分隔线标签07 换行标签08 文本的格式化标签09 特殊字符标签10 图像标签14 相对路径与绝对路径11 章节练习-《清平乐》12 章节练习-《李清照简介》13 章节练习-《家电排行》15 章节练习-《百度网简介》16 超级链接标签17 锚点链接18 影像地图19 《table》表格标签20 无序列表标签21 有序列表标签22 定义列表标签23 章节练习-《工资明细》24 章节练习-《我的电脑》25 章节练习-《在线考试》三、层叠样式表01 CSS简介02 CSS样式规则03 CSS样式的调用方法04 标签选择器05 类选择器06 ID选择器07 标签指定式选择器08 包含(后代)选择器09 群组选择器10 通配符选择器11 属性选择器12 关系选择器13 链接伪类选择器四、样式属性01 字体属性02 文本属性03 阴影效果04 对象内溢出文本05 背景设置06 定义列表的样式五、盒模型网页布局01 初识盒子模型02 边框属性(border)03 边距属性(padding与margin)04 圆角边框05 阴影效果06 浮动属性(float)07 元素定位(position)08 溢出属性(overflow)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧