2010-03-18 108 views
2

我想比较使用通配符的4个字符的字符串。C++/STL字符串:如何通过通配符模拟正则表达式的函数?

例如:

std::string wildcards[]= 
{"H? ", "RH? ", "H[0-5] "}; 
/*in the last one I need to check if string is "H0 ",..., and "H5 " */ 

是否有可能只管理由STL实现?

谢谢, Arman。

编辑:

我们可以不用boost.regex?
或者我应该添加另一个库的依赖关系到我的项目:)

+1

你是不是指'std :: string wildcards [] = {...'? – 2010-03-18 16:42:01

+0

“只使用STL”是什么意思?如果你想要做的就是处理基本的通配符,那么基于'for'循环就可以完成简单的事情...... – Pillsy 2010-03-18 16:42:47

+0

“在语言X中可以执行Y”的答案通常是在X不是一种语言功能。即使这样你通常可以找到解决办法。所以很可能。当谈到如何做到这一点时,我想我们需要更清楚和更详细地描述这个问题。 – 2010-03-18 16:43:38

回答

4

使用Boost.Regex

+0

Boost.Xpressive怎么样?(我不知道它是什么,但使用谷歌搜索弹出)。 – Arman 2010-03-18 16:59:27

+0

@Arman:我会用Boost.Regex,因为C++ 0x草稿正则表达式基于它 – stephan 2010-03-18 17:09:30

+0

@Stephan:这是否意味着在未来我可以将boost :: regex更改为std :: tr1 ::正则表达式或类似的东西? – Arman 2010-03-18 17:16:19

2

没有 - 你需要的boost ::正则表达式

0

正则表达式是为这种事做。我可以理解你不愿意避免依赖,但在这种情况下,这可能是合理的。

您可能会检查C++编译器以查看它是否包含任何内置正则表达式库。例如,微软包括CAtlRegExp

除此之外,您的问题看起来不太难编写自定义代码。

+0

@Mark:谢谢你的回答。实际上代码是独立于平台的。目前它使用几个strcmps,但这种方法是不可扩展的。 – Arman 2010-03-18 17:07:05

0

您可以在不引入新的库依赖关系的情况下做到这一点,但要做到这一点,您最终会自己编写正则表达式引擎(或至少是其中的一个子集)。

是否有某些原因导致您不想使用库?

+0

@Joe:是的,你在我看来,我需要在这里包含Boost.Regex,代码是纯C++/STL,并且是可移植的,有时在不同的机器上没有安装BOOST。 – Arman 2010-03-18 17:12:06

+0

如果您需要在没有提升的机器上进行编译,您可以提取boost regex头文件和源代码,并将它们直接整合到您的项目中。我想我记得在某些时候在boost用户邮件列表上看到了这样的讨论。 – 2010-03-18 17:18:02

+0

是的,那是真的,这是bcp工具。 – Arman 2010-03-18 17:20:10