Hi, In this regex the \n matches \r. How is this defined / controlled? Is there a way to only match \n? std::string s = "[*] A\rB\n"; s = boost::regex_replace(s, boost::regex(R"(\[\*\](.+?)(\n|$))"), "<li>\\1</li>"); std::println("{}", js_encode(s)); // <li> A</li>\rB\n Regards, -- Olaf
On Fri, Mar 20, 2026, at 8:29 AM, Olaf van der Spek via Boost wrote:
Hi,
In this regex the \n matches \r. How is this defined / controlled? Is there a way to only match \n?
std::string s = "[*] A\rB\n"; s = boost::regex_replace(s, boost::regex(R"(\[\*\](.+?)(\n|$))"), "<li>\\1</li>"); std::println("{}", js_encode(s)); // <li> A</li>\rB\n
Regards,
To me it appears as if `$` might be behaving like that: https://godbolt.org/z/s1zaMqT1q #include <boost/regex.hpp> #include <fmt/ranges.h> #include <span> int main() { std::string s = "A\rB\n"; s = boost::regex_replace(s, boost::regex(R"((.+?)\n)"), "<\\1>"); fmt::print("{}\n", std::span(s)); fmt::print("{::#x}\n", std::span(s)); } Which prints, on my linux box: ['<', 'A', '\r', 'B', '>'] [0x3c, 0x41, 0xd, 0x42, 0x3e] Of course, there might be some Windows quirk involved.
On 20/03/2026 07:29, Olaf van der Spek via Boost wrote:
Hi,
In this regex the \n matches \r. How is this defined / controlled? Is there a way to only match \n?
std::string s = "[*] A\rB\n"; s = boost::regex_replace(s, boost::regex(R"(\[\*\](.+?)(\n|$))"), "<li>\\1</li>"); std::println("{}", js_encode(s)); // <li> A</li>\rB\n
\n is a regular expression meaning "Match any newline character", which happens to include \r and a few other things as well. If you want to match a literal '\n' then you need to escape it and the appropriate regular expression string is therefore R"\\n" HTH, John.
On 3/20/26 20:33, John Maddock via Boost wrote:
On 20/03/2026 07:29, Olaf van der Spek via Boost wrote:
Hi,
In this regex the \n matches \r. How is this defined / controlled? Is there a way to only match \n?
std::string s = "[*] A\rB\n"; s = boost::regex_replace(s, boost::regex(R"(\[\*\](.+?)(\n|$))"), "<li>\\1</li>"); std::println("{}", js_encode(s)); // <li> A</li>\rB\n
\n is a regular expression meaning "Match any newline character", which happens to include \r and a few other things as well. If you want to match a literal '\n' then you need to escape it and the appropriate regular expression string is therefore R"\\n"
He's trying to match the newline character, not '\' followed by 'n'. Which in a raw string would be R"( )", with the actual line break in the raw string. -- Rainer Deyke - rainerd@eldwood.com
On 21/03/2026 15:31, Rainer Deyke via Boost wrote:
On 3/20/26 20:33, John Maddock via Boost wrote:
On 20/03/2026 07:29, Olaf van der Spek via Boost wrote:
Hi,
In this regex the \n matches \r. How is this defined / controlled? Is there a way to only match \n?
std::string s = "[*] A\rB\n"; s = boost::regex_replace(s, boost::regex(R"(\[\*\](.+?)(\n|$))"), "<li>\\1</li>"); std::println("{}", js_encode(s)); // <li> A</li>\rB\n
\n is a regular expression meaning "Match any newline character", which happens to include \r and a few other things as well. If you want to match a literal '\n' then you need to escape it and the appropriate regular expression string is therefore R"\\n"
He's trying to match the newline character, not '\' followed by 'n'. Which in a raw string would be R"( )", with the actual line break in the raw string.
Yes exactly, the regular expression which matches a literal \n is \\n, otherwise \n on it's own is a regular expression operator and not a literal. John.
participants (4)
-
John Maddock -
Olaf van der Spek -
Rainer Deyke -
Seth