<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">