Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;大字符串上的正则表达式_C++_Regex - Fatal编程技术网

C++ C++;大字符串上的正则表达式

C++ C++;大字符串上的正则表达式,c++,regex,C++,Regex,我需要检查一个特定的模式是否出现在一个大字符串的开始(比如说千兆字节的顺序),我想知道C++标准库正则表达式是否合适。 我尝试在模式开始时使用regex\u搜索^,在模式结束时使用regex\u匹配*,但当字符串达到几十兆字节时,两者都会崩溃 有没有我应该使用的技巧,还是C++正则表达式不是大字符串的正确工具?< /P> 对于测试用例,我使用了一个完全由“aaaaaa…”组成的字符串和一个由“^aaa”或“aaa.*”组成的正则表达式来保持简单。我在微软C++上进行了测试;无论我最终使用什么解决

我需要检查一个特定的模式是否出现在一个大字符串的开始(比如说千兆字节的顺序),我想知道C++标准库正则表达式是否合适。 我尝试在模式开始时使用
regex\u搜索
^
,在模式结束时使用
regex\u匹配
*
,但当字符串达到几十兆字节时,两者都会崩溃

有没有我应该使用的技巧,还是C++正则表达式不是大字符串的正确工具?< /P>


对于测试用例,我使用了一个完全由
“aaaaaa…”
组成的字符串和一个由
“^aaa”
“aaa.*”
组成的正则表达式来保持简单。我在微软C++上进行了测试;无论我最终使用什么解决方案,都必须在Windows和Linux上运行。

您可以做的一件事是使用迭代器限制搜索范围,如本例所示,迭代器最多只能检查前100个字符:

int main()
{
    std::string s(1024 * 1024 * 1024, 'a');

    std::regex e("^aaa");

    // limit the range of your search using iterators
    if(std::regex_search(s.begin(), s.begin() + 100, e)) // 100 max
    {
        std::cout << "yes\n";
    }

}
intmain()
{
std::字符串s(1024*1024*1024,'a');
标准::正则表达式e(“^aaa”);
//使用迭代器限制搜索范围
if(std::regex_search(s.begin(),s.begin()+100,e))//100 max
{

std::cout可以做的一件事是使用迭代器限制搜索范围,如本例所示,迭代器最多只检查前100个字符:

int main()
{
    std::string s(1024 * 1024 * 1024, 'a');

    std::regex e("^aaa");

    // limit the range of your search using iterators
    if(std::regex_search(s.begin(), s.begin() + 100, e)) // 100 max
    {
        std::cout << "yes\n";
    }

}
intmain()
{
std::字符串s(1024*1024*1024,'a');
标准::正则表达式e(“^aaa”);
//使用迭代器限制搜索范围
if(std::regex_search(s.begin(),s.begin()+100,e))//100 max
{

std::cout从技术上讲,像
*
这样的简单情况可以优化为使用O(1)内存。问题可能出在其他地方。您可能希望将有问题的正则表达式包括在问题中。@nhahtdh对,这样的情况可以进行优化,但似乎至少在Microsoft的实现中没有。好的,添加了。锚定正则表达式的
regex\u search
的问题是锚定可能匹配在字符串中搜索换行符。如果正则表达式在字符串开头实际匹配,这应该无关紧要,但这意味着如果模式不匹配,可以在换行符后搜索字符串的其余部分以查找模式的实例。使用
match\u continuous
来真正定位。(正如问题所述,这不应适用,但长输入字符串也不应导致崩溃。也许您需要粘贴实际可执行代码。)@rici
match_continuous
而不是
^
起到了作用。谢谢!@rwallace:你这里的问题定义得很不清楚。你可能想澄清它并发布自己的答案,或者干脆删除这个问题。从技术上讲,像
*
这样的简单案例可以优化为使用O(1)内存。问题可能出在其他地方。您可能希望将有问题的正则表达式包括在问题中。@nhahtdh对,这样的情况可以进行优化,但似乎至少在Microsoft的实现中没有。好的,添加了。锚定正则表达式的
regex\u search
的问题是锚定可能匹配在字符串中搜索换行符。如果正则表达式在字符串开头实际匹配,这应该无关紧要,但这意味着如果模式不匹配,可以在换行符后搜索字符串的其余部分以查找模式的实例。使用
match\u continuous
来真正定位。(正如问题所述,这不应适用,但长输入字符串也不应导致崩溃。也许您需要粘贴实际可执行代码。)@rici
match_continuous
而不是
^
起到了作用。谢谢!@rwallace:你这里的问题定义得很不清楚。你可能想澄清一下并发布自己的答案,或者干脆删除这个问题。