1. ホーム
  2. c

[解決済み] 警告: 不明なエスケープシーケンス '\

2022-02-09 15:47:42

質問

コード内のシステムコマンドで正規表現を実行しようとしています。StackOverflowの同様の警告に関するスレッドに目を通しましたが、以下の警告を修正する方法が分かりませんでした。} 警告は消えているようですが、リダイレクトされたファイルに正確な出力を得ることができません。

#include<stdio.h>


int main(){

        FILE *in;
        char buff[512];

if(system("grep -o '[0-9]\{1,3\}\\.[0-9]\{1,3\}\\.[0-9]\{1,3\}\\.[0-9]\{1,3\}' /home/santosh/Test/text >t2.txt") < 0){
                printf("system failed:");
                exit(1);
        }
}

警告

dup.c:9:11: warning: unknown escape sequence '\}'
dup.c:9:11: warning: unknown escape sequence '\}'
dup.c:9:11: warning: unknown escape sequence '\}'
dup.c:9:11: warning: unknown escape sequence '\}'
dup.c: In function 'main':

解決方法は?

C言語の文字列リテラルでは \ は特別な意味を持っており、改行などの文字を表現するためのものです。 \n . を置きたい場合は \ を文字列の中で使用する必要があります。 \\ .

例えば

"\\Hello\\Test"

は、実際には" \HelloTest" となります。

というわけで、正規表現は次のように書く必要があります。

"[0-9]\\{1,3\}\\\\.[0-9]\\{1,3\}\\\\.[0-9]\\{1,3\\}\\\\.[0-9]\\{1,3\\}"

の代わりに

"[0-9]\{1,3\}\\.[0-9]\{1,3\}\\.[0-9]\{1,3\}\\.[0-9]\{1,3\}"

確かにこれは痛いです、なぜなら \ は正規表現のエスケープ文字として使われ、さらに文字列リテラルのエスケープ文字として使われます。

つまり、基本的には \ を記述する必要があります。 \\ .