

C++ GCC9.2.1において、以下のコードを実行したところ、trueが返ってきました。

[code]

    #include <regex>
    std::regex_search("2(a", std::regex("\([a-z]*\)")); //true
    
[/code]

私は(のエスケープに失敗しているのが原因だと思うのですが、何が原因なのでしょうか。  
解決方法等ありましたら教えてくださると嬉しいです。  
拙い質問で申し訳ありませんが、よろしくお願いします。


CC BY-SA 4.0
2023-06-24T13:49:16.853
95360
2023-06-26T04:36:26.833
58854
question
c++ gcc
C++ GCCにおいて、括弧のエスケープが効かない


@metropolis さんのコメントの通り、バックスラッシュが足りていません。  
コンパイルオプションに`-Wall`を付け、警告を無視しない癖を付けましょう。

<https://godbolt.org/z/j9ExTbjEb>

[code]

    #include <regex>
    #include <iostream>
    
    int main()
    {
        std::cout << std::regex_search("2(a", std::regex("\([a-z]*\)")) << "\n"; // true
        std::cout << std::regex_search("2(a", std::regex("\\([a-z]*\\)")) << "\n"; // false
    }
    
[/code]

Compiler stderr:

[code]

    <source>: In function 'int main()':
    <source>:6:54: warning: unknown escape sequence: '\('
        6 |     std::cout << std::regex_search("2(a", std::regex("\([a-z]*\)")) << "\n"; // true
          |                                                      ^~~~~~~~~~~~
    <source>:6:54: warning: unknown escape sequence: '\)'
    
[/code]


CC BY-SA 4.0
2023-06-24T17:25:01.760
95364
2023-06-24T17:25:01.760
7291
95360
answer


`<regexp>` を使っているということは [c++11](/questions/tagged/c%2b%2b11 "'c++11'
のタグが付いた質問を表示") 以後を想定してるってことで  
[c++11](/questions/tagged/c%2b%2b11 "'c++11' のタグが付いた質問を表示") では [raw string
literal](https://cpprefjp.github.io/lang/cpp11/raw_string_literals.html)
なるものが導入されましたのでこちらを使う手も

[code]

    // 下記２行は同じ意味
    std::cout << std::regex_search("2(a", std::regex("\\([a-z]*\\)")) << std::endl;
    std::cout << std::regex_search(R"(2(a)", std::regex(R"(\([a-z]*\))")) << std::endl;
    
[/code]

文字列を開始する `"` の代わりに `R"(` と書く  
文字列を終了する `"` の代わりに `)"` と書く  
生文字列リテラル中は `\` によるエスケープが無効になる  
生文字列リテラル中に `)"` なる文字を書きたいときは開始終了パターンを変更できる

実際に使ってみると見やすいとは断言できないのがなんとも...  
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") は生文字列リテラルに未対応なのがなんとも...  
（ [gcc](/questions/tagged/gcc "'gcc' のタグが付いた質問を表示") は `-std=gnu99` で対応しているが
[clang](/questions/tagged/clang "'clang' のタグが付いた質問を表示") は非対応とかややこしい）

`trigraph` はプリプロセス前に変換されるはずなのに生文字列リテラル中では変換されないっぽい（cygwin64 の g++ 11.4.0
でコンパイルオプション `-trigraph` を指定してみたが `??(` のままだった）などなど今すぐ実用にするにはちょっと怖いっス。


CC BY-SA 4.0
2023-06-26T02:17:28.133
95372
2023-06-26T04:36:26.833
2023-06-26T04:36:26.833
8589
8589
95360
answer