I use a various regexes to parse a C source file, line by line. First i read all the content of file in a string:
ifstream file_stream(\"commented.cpp\",ifstream
#include <stdio.h> //comment
The code should fail, my logic is with those options to regex_search, the match should fail, because it should search for pattern in the first line:
#include <stdio.h>
But instead it searches whole string, and immideatly finds //comment. I need help, to make regex_search match only in current line.
Are you trying to match all //
comments in a source code file, or only the first line?
The former can be done like this:
#include <iostream>
#include <fstream>
#include <regex>
int main()
{
auto input = std::ifstream{"stream_union.h"};
for(auto line = std::string{}; getline(input, line); )
{
auto submatch = std::smatch{};
auto pattern = std::regex(R"(//)");
std::regex_search(line, submatch, pattern);
auto match = submatch.str(0);
if(match.empty()) continue;
std::cout << line << std::endl;
}
std::cout << std::endl;
return EXIT_SUCCESS;
}
And the later can be done like this:
#include <iostream>
#include <fstream>
#include <regex>
int main()
{
auto input = std::ifstream{"stream_union.h"};
auto line = std::string{};
getline(input, line);
auto submatch = std::smatch{};
auto pattern = std::regex(R"(//)");
std::regex_search(line, submatch, pattern);
auto match = submatch.str(0);
if(match.empty()) { return EXIT_FAILURE; }
std::cout << line << std::endl;
return EXIT_SUCCESS;
}
If for any reason you're trying to get the position of the match, tellg() will do that for you.
If it is not what you want please comment so I will delete the answer
What you are doing is not a correct way of using a regex library.
Thus here is my suggestion for anyone that wants to use std::regex
library.
ECMAScript
that somehow is a little
poor than all modern regex
library.It has bugs as many as you like ( just I found ):
In some cases (I test specifically with std::match_results
) It is 200 times slower in comparison to std.regex
in d language
flag-match
and almost it does not work (at least for me)conclusion: do not use it at all.
But if anyone still demands to use c++ anyway then you can:
use boost::regex
about Boost library because:
PCRE
supportstd::regex
use gcc version 7.1.0
and NOT below. The last bug I found is in version 6.3.0
clang version 3
or above If you have enticed (= persuade) to NOT use c++ then you can use:
Use d regular expression link library for large task: std.regex
and why:
Use native pcre
or pcre2
link that have been written in c