<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/77577>77577</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[libc++] regex `\b` and `\B` behaviors different from MSVC and libstdc++
</td>
</tr>
<tr>
<th>Labels</th>
<td>
libc++
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zufuliu
</td>
</tr>
</table>
<pre>
https://godbolt.org/z/KGWPj8qjv
```c++
#include <string>
#include <regex>
#include <iostream>
using namespace std;
void show_match_result(const char *tag, const sregex_iterator &it) {
auto match = *it;
cout << tag << match.position(0) << ", " << match.length(0) << endl;
}
int main() {
string s = "ab";
auto start = s.cbegin() + 1;
auto end = sregex_iterator();
regex re0("\\b");
cout << "\\b" << endl;
auto it = sregex_iterator(s.cbegin(), s.cend(), re0, regex_constants::match_default);
for (; it != end; ++it) {
show_match_result("0 match_default: ", it);
}
it = sregex_iterator(start, s.cend(), re0, regex_constants::match_default);
for (; it != end; ++it) {
show_match_result("1 match_default: ", it);
}
it = sregex_iterator(start, s.cend(), re0, regex_constants::match_prev_avail);
for (; it != end; ++it) {
show_match_result("1 match_prev_avail: ", it);
}
it = sregex_iterator(start, s.cend(), re0, regex_constants::match_not_bow);
for (; it != end; ++it) {
show_match_result("1 match_not_bow: ", it);
}
it = sregex_iterator(start, s.cend(), re0, regex_constants::match_prev_avail | regex_constants::match_not_bow);
for (; it != end; ++it) {
show_match_result("1 match_prev_avail | match_not_bow: ", it);
}
regex re1("\\B");
cout << "\n\\B" << endl;
it = sregex_iterator(s.cbegin(), s.cend(), re1, regex_constants::match_default);
for (; it != end; ++it) {
show_match_result("0 match_default: ", it);
}
it = sregex_iterator(start, s.cend(), re1, regex_constants::match_default);
for (; it != end; ++it) {
show_match_result("1 match_default: ", it);
}
it = sregex_iterator(start, s.cend(), re1, regex_constants::match_prev_avail);
for (; it != end; ++it) {
show_match_result("1 match_prev_avail: ", it);
}
it = sregex_iterator(start, s.cend(), re1, regex_constants::match_not_bow);
for (; it != end; ++it) {
show_match_result("1 match_not_bow: ", it);
}
it = sregex_iterator(start, s.cend(), re1, regex_constants::match_prev_avail | regex_constants::match_not_bow);
for (; it != end; ++it) {
show_match_result("1 match_prev_avail | match_not_bow: ", it);
}
it = sregex_iterator(s.cbegin(), s.cend() - 1, re1, regex_constants::match_default);
for (; it != end; ++it) {
show_match_result("-1 match_not_eow: ", it);
}
it = sregex_iterator(s.cbegin(), s.cend() - 1, re1, regex_constants::match_not_eow);
for (; it != end; ++it) {
show_match_result("-1 match_not_eow: ", it);
}
return 0;
}
```
MSVC 2022 17.8.4:
```
\b
0 match_default: 0, 0
0 match_default: 2, 0
1 match_default: 0, 0
1 match_default: 1, 0
1 match_prev_avail: 1, 0
1 match_not_bow: 1, 0
1 match_prev_avail | match_not_bow: 1, 0
\B
0 match_default: 1, 0
1 match_prev_avail: 0, 0
1 match_not_bow: 0, 0
1 match_prev_avail | match_not_bow: 0, 0
-1 match_not_eow: 1, 0
```
mingw-w64 GCC 13.2.0 and GCC trunk:
```
\b
0 match_default: 0, 0
0 match_default: 2, 0
1 match_default: 0, 0
1 match_default: 1, 0
1 match_prev_avail: 1, 0
1 match_prev_avail | match_not_bow: 1, 0
\B
0 match_default: 1, 0
1 match_prev_avail: 0, 0
1 match_not_bow: 0, 0
1 match_prev_avail | match_not_bow: 0, 0
-1 match_not_eow: 1, 0
```
llvm-mingw 17.0.6 and libc++ truck:
```
\b
0 match_default: 0, 0
1 match_default: 0, 0
\B
0 match_default: 1, 0
0 match_default: 2, 0
1 match_prev_avail: 0, 0
1 match_prev_avail: 1, 0
1 match_not_bow: 0, 0
1 match_not_bow: 1, 0
1 match_prev_avail | match_not_bow: 0, 0
1 match_prev_avail | match_not_bow: 1, 0
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWFuP6jYQ_jXOi0XkjIGEBx64lPNQVapUqX1ETuIEb4NNbYdtz6-v7HBJ2LCwnEu3267QLmbGM98383lYhxkjSsn5FI3maLQMWG03Sk8_10VdiTpIVf7XdGPtziA6Q7BCsCpVnqrKhkqXCFafEax-_PTbz0_JH097RJaIzA6_x6R5ZQjm7tV8ClTIrKpzjhFdGKuFLBH9oc-oecn_vGITyljN2fZkro2QJZZsy82OZRwbmyM6b-PZK5Fjs1HP6y2z2WatuakriyDJlDQWZxumMYKZZSWCBW4-NB7DWliumVXOPhYWwQSj-BR7wmqrsI-JEV26GMKecmOMcaZq60AjusCWlce3fku4U0ZYoSSChPjIjREBOBgIoOtecVnazYUzl3l1Zhsv27SFtHjLhIvfAe6ANeXH5oAbWOrStqF7bsYybb2PCbOUl-dgMMfRS38u88a7W71mU8fdO2DNibcBGi3QaOFBXDi2S9hx7C3BCYmwV4B0ibhKmzDjMj-vPahFg3Dt1cCk9YeAzhoB5bxgXkFdqIXXSYLo3KeHyCFwoekcNyfhQkK9okQABHfz0NlRFeJF0lPT3eI6a9fIr0f27UwPP1cIR--J8E7z_Zrtmai-WYOPfFup_lHKUtl1qp6_S4-Pud5JjzGK301pLlA9UK-XAzZqD9j5XQNWnp2vDtkvmq_Rf2m-PkL2Xz1fbxH-gPP1FuUPN1_v7_FHna8PDkA8wNF3HoKv12bQ1g1_rQ53iuYr0T_C-VYj4n7el-dFc1triUnPvet48W2L5adffl1gIAA4isMkHDqSvd7uWuPf9Xw9-f9nyFUztMw9s568bo56zN3J2efROjevB-g_a-09pwLMrzK8jbGPZCtfn_kWxvaePr10OPT1fitk-Tx4Hg_xp8UCRzSEkGAmc7-0upa_fxQ1_N9uRGZVtd8OfM_dWSfh2Pe6EunhQZhrefblLb_R0zeW904B3a7-m0bGjfY9IrFHWt7b0iCf0nxCJyzg0ygmwySBeESDzTTOSEKiJEvYGAogE16MiiRKeEEYAInHgZgCgSGJIhIRCpSGcZLxSZoWBRmN2ZgM0ZDwLRNV6KQSKl0GwpiaT-N4FMdBxVJeGf88FuAsG38rWwZ66vWV1qVBQ1IJY805jBW28k9yW9tGy8Mt0NFy4ho3w6dZzt0y5Ru2F0obnIui4JpLiwuttth_ax3Ua2x-CBnUurp8Jizspk7DTG0RrBycw5_BTqsnnlkEK0_RIFh5ln8HAAD__8jjXxQ">