我试图在C++ 11代码中使用std :: regex,但看起来支持有点儿错误.一个例子:
#include <regex>
#include <iostream>
int main (int argc, const char * argv[]) {
std::regex r("st|mt|tr");
std::cerr << "st|mt|tr" << " matches st? " << std::regex_match("st", r) << std::endl;
std::cerr << "st|mt|tr" << " matches mt? " << std::regex_match("mt", r) << std::endl;
std::cerr << "st|mt|tr" << " matches tr? " << std::regex_match("tr", r) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
st|mt|tr matches st? 1
st|mt|tr matches mt? 1
st|mt|tr matches tr? 0
Run Code Online (Sandbox Code Playgroud)
当使用gcc(MacPorts gcc47 4.7.1_2)4.7.1编译时,使用
g++ *.cc -o test -std=c++11 …Run Code Online (Sandbox Code Playgroud) 可以?如果是的话,我在哪里可以得到它的文件......如果没有,那么哪个是最好的选择?
我想在C++中做一些正则表达式,所以我查看了interwebz(是的,我是C++的初学者/中级)并找到了这个SO答案.
我真的不知道在boost :: regex和boost :: xpressive之间做什么选择.有哪些优点/缺点?
我还读到与boost :: regex相对的boost :: xpressive是一个只有头的库.是不是很难在Linux和Windows上静态编译boost :: regex(我几乎总是编写跨平台应用程序)?
我也对编译时间的比较感兴趣.我有一个使用boost :: xpressive的当前实现,我对编译时间不太满意(但我没有与boost :: regex进行比较).
当然,我也对正则表达式实现的其他建议持开放态度.要求是免费的(如在啤酒中)并与http://nclabs.org/license.php兼容.
我正试图从头开始学习一些C++.
我精通python,perl,javascript,但在过去的课堂环境中只是简单地遇到过C++.请原谅我的问题的天真.
我想使用正则表达式拆分一个字符串,但是没有太多运气找到一个清晰,明确,有效和完整的如何在C++中执行此操作的示例.
在perl中,这是行动是常见的,因此可以以微不足道的方式完成,
/home/me$ cat test.txt
this is aXstringYwith, some problems
and anotherXY line with similar issues
/home/me$ cat test.txt | perl -e'
> while(<>){
> my @toks = split(/[\sXY,]+/);
> print join(" ",@toks)."\n";
> }'
this is a string with some problems
and another line with similar issues
Run Code Online (Sandbox Code Playgroud)
我想知道如何最好地完成C++中的等价物.
编辑:
我想我在boost库中找到了我想要的东西,如下所述.
boost regex-token-iterator(为什么不强调工作?)
我想我不知道该搜索什么.
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
int main(int argc)
{
string s;
do{
if(argc == 1)
{
cout << "Enter text to …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种定义文本表达式的通用方法,它允许验证值.
例如,我有一个值应该只设置为1,2,3,10,11或12.它的约束可以定义为: (value >= 1 && value <= 3) || (value >= 10 && value <= 12)
或者另一个可以是1,3,5,7,9等的值......会有像value % 2 == 1或那样的约束IsOdd(value).
(为了帮助用户更正无效值,我想显示约束 - 所以描述IsOdd性更好.)
这些约束将在客户端(用户输入之后)和服务器端进行评估.因此,多平台解决方案将是理想的(特别是Win C#/ Linux C++).
是否存在允许评估或解析类似简单表达式的现有语言/项目?
如果没有,我可以从哪里开始创建自己的?
我意识到这个问题有点模糊,因为我不完全确定我追求的是什么.搜索结果没有结果,因此即使某些术语作为起点也会有所帮助.然后我可以相应地更新/标记问题.
试图学习如何在C++ 11中使用新的std :: regex.但我尝试的例子是抛出一个我不明白的regex_error异常.这是我的示例代码:
#include <iostream>
#include <regex>
int main()
{
std::string str = "xyzabc1xyzabc2xyzabc3abc4xyz";
std::regex re( "(abc[1234])" ); // <-- this line throws a C++ exception
// also tried to do this:
// std::regex re( "(abc[1234])", std::regex::optimize | std::regex::extended );
while ( true )
{
std::cout << "searching in " << str << std::endl;
std::smatch match;
std::regex_search( str, match, re );
if ( match.empty() )
{
std::cout << "...no more matches" << std::endl;
break;
}
for ( auto x …Run Code Online (Sandbox Code Playgroud) 我有另一个程序的输出,这个程序更像是人类可读而不是机器可读,但我还是打算解析它.这没什么太复杂的.
然而,我想知道在C++中最好的方法是什么.这更像是一种"一般惯例"类型的问题.
我查看了Boost.Spirit,甚至让它工作了一下.那东西太疯狂了!如果我正在设计我正在阅读的语言,它可能是适合这项工作的工具.但实际上,考虑到它的极端编译时间,当我做错任何事情时,g ++会出现几页错误,这不是我需要的.(我也不太需要运行时性能.)
考虑使用C++运算符<<,但这似乎毫无价值.如果我的文件中有"John有5个小部件"这样的行,而其他人"Mary在459 Ramsy street工作",我怎么能确保我的程序中有第一个类型的行,而不是第二个类型?我必须阅读整行,然后使用类似的东西string::find,string::substr我想.
那就离开了sscanf.它会很好地处理上述情况
if( sscanf( str, "%s has %d widgets", chararr, & intvar ) == 2 )
// then I know I matched "foo has bar" type of string,
// and I now have the parameters too
Run Code Online (Sandbox Code Playgroud)
所以我只是想知道我是否遗漏了某些内容,或者C++是否真的没有太多的内置替代品.
问题: 我有一个巨大的原始文本文件(假设为3gig),我需要浏览文件中的每个单词,并发现文件中出现了多少次单词.
我建议的解决方案: 将大文件拆分成多个文件,每个拆分文件都有一个排序的文字.例如,所有以" a " 开头的单词都将存储在" _a.dic "文件中.所以,我们任何时候都不会超过26个文件.
这种方法的问题是,
我可以使用流来读取文件,但是想使用线程来读取文件的某些部分.例如,使用单独的线程读取0-1024个字节(至少有4-8个线程,基于处理器中存在的处理器数量).这是可能的还是我在做梦?
有更好的方法吗?
注意:它应该是纯c ++或基于c的解决方案.不允许有数据库等.
我有一个文本行的文本文件,其中包含一个字符串,另一个字符串后跟最多4个整数,例如:
clear "clear water.png" 5 7
wet "wet water.png" 9 5 33 17
soft "soft rain falling.png"
Run Code Online (Sandbox Code Playgroud)
我看到的唯一方法是:
阅读直到找到空间
将字符串设置为湿
读到双引号
读到第二个双引号
将第二个字符串设置为wet water.png
而不是行尾
读到太空
把字符串放入字符串流
将结果整数推送到int的向量中
有一个更好的方法吗?
谢谢