0

私はCでいくつかの正規表現を試していました。つまり、テキストファイルの行を処理しようとしていました:

MY NAME IS   ;;JOHN 

私はsscanfのフォーマットパラメータで使用sscanfして一致させていました。これをRubular%s %s %s %[^;]でテストすると(つまり、「あなたの正規表現:」フィールドと「テスト文字列:」フィールドに入力します)、データと一致します。[^;];;testtest

ただし、次の行で

sscanf("MY NAME IS ;;JOHN", "%s %s %s %[^;], str1, str2, str3, str4)

4 番目の文字列str4は実際には一致しません。つまり、 をsscanf返します3。私の知る限り、正規表現[^;]はセミコロン以外の任意の文字にsscanf一致し;;JOHNます。

これは単に の問題sscanfですか、それとも glibc は何らかの理由で正規表現を別の方法で行うのでしょうか? sscanf文字列の最初の文字が実際にセミコロンであるため、4 番目の文字列との一致に失敗しているため、文字列と正確に一致することはできませんか? それが3を返す理由ですか?

さらに、次のような行がMY NAME IS DOE;;JOHNあり、 を使用するsscanfと、関数は 4 を返します。

4

1 に答える 1

2

ここで、正規表現についてのマニュアルページの内容を参照してください。sscanf()

明確にするために、「通常」という単語がマニュアルページに表示されないため、上記の引用は空です。これは、sscanf()と friends で使用されるパターンが正規表現ではないためです。あなたはそれらがそうであることを期待しているようで、それが混乱を引き起こしています.

文字範囲構文%[]は次のように記述されます。

[ 指定された受け入れられる文字セットから空でない文字シーケンスに一致します。次のポインターは char へのポインターである必要があり、文字列内のすべての文字に加えて、終端の null バイトに十分なスペースが必要です。

先頭の空白の通常のスキップは抑制されます。文字列は、特定のセットに含まれる (または含まれない) 文字で構成されます。セットは、開き括弧 [文字と閉じ括弧] 文字の間の文字によって定義されます。

開き括弧の後の最初の文字がサーカムフレックス (^) である場合、セットはそれらの文字を除外します。セットに閉じ括弧を含めるには、開き括弧またはサーカムフレックスの後の最初の文字にします。他の位置はセットを終了します。

ハイフン文字 - も特殊です。他の 2 つの文字の間に配置すると、間にあるすべての文字がセットに追加されます。ハイフンを含めるには、最後の閉じ括弧の前の最後の文字にします。たとえば、[^]0-9-] は、「右括弧、0 から 9、およびハイフンを除くすべて」のセットを意味します。文字列は、セットに含まれていない (または曲折アクセント付きで in) 文字の出現で終了するか、フィールド幅がなくなると終了します。

于 2013-04-25T06:46:21.157 に答える