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

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

比如:*abcd == ?abcd*
...全文
486 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个通配的串比较,这样有问题吧

16,472

社区成员

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

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

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