2

C#/WPF パーサーを作成しようとしています。これは私の最初のパーサーではないため (おそらく最後ではないでしょう)、正規表現について全体的によく理解しています。

しかし、今、私は非常に奇妙な行動をしています。これが私が解析しようとしているものです(注:実際のデータは削除されました。私と同じ構造に従って文字列を作成しただけです):

aaaaa bbbbb 50 c blabla

私のアプリケーションは、分割して認識したいだけの行を受け取ります。スペースの数は、何らかの理由で可変です (aaaa と bbbb の間に 1 つ、bbbb と 50 の間に 2 つ...)。(人々が私に言う前に注意してください:私はstring.Split()を使用しません。私は多くの異なる行構造を持っており、常に同じデータを取得する必要があるためです。それを分割するだけでは、すべてのものが認識できなくなります一部を意味します)

私の現在のテスト正規表現はちょっと単純です:

(\S*)[\s*](\S*)[\s*](\S*)[\s*](p|c)(.*)

そして今、これが起こることです。bbbbb と 50 の間にスペースが 1 つしかない場合、正規表現は正しく解析されます (注: http://www.myregextester.com/index.phpを使用して正規表現をテストします) 。

$matches Array:
(
    [0] => Array
        (
            [0] => aaaaa bbbbb 50 c  blabla
        )

    [1] => Array
        (
            [0] => aaaaa
        )

    [2] => Array
        (
            [0] => bbbbb
        )

    [3] => Array
        (
            [0] => 50
        )

    [4] => Array
        (
            [0] => c
        )

    [5] => Array
        (
            [0] =>   blabla
        )

)

bbbb と 50 の間に2 つのスペースがある場合、次のようになります。

$matches Array:
(
    [0] => Array
        (
            [0] => bbbbb  50 c blabla
        )

    [1] => Array
        (
            [0] => bbbbb
        )

    [2] => Array
        (
            [0] => 
        )

    [3] => Array
        (
            [0] => 50
        )

    [4] => Array
        (
            [0] => c
        )

    [5] => Array
        (
            [0] =>  blabla
        )

)

これで、行から不要なスペースを簡単に削除できることがわかりました(これは現在行っていることです)。とにかく、何が欠けているのかを理解したいと思っています。追加した [\s*] のいずれかで認識されるはずの余分なスペースを1つ追加すると、なぜこれが起こるのでしょうか?

ありがとうございました!

4

4 に答える 4

3

正規表現で星を見るたびに、私はうんざりします。スターは 0 個以上に一致し、本当にあなたをつまずかせる可能性があります! のすべてのインスタンスをに置き換えて*+再試行してください。もちろん、これらのグループ化のいくつかが実際にオプションである場合を除きます。

編集:他の答えは、あなたが文字グループを使用していたことを非常に正しく指摘していますが、私の主張はまだ立っています:注意して*ください!

于 2013-07-09T14:54:34.117 に答える
2

に置き換える必要があり[\s*]ます\s+

[\s*]「1 つの空白文字または 1 つのアスタリスク」を意味します。

\s+「1つ以上の空白文字」を意味します。これはあなたが望むものです。

文字クラスは、多くの人が誤解しているものです。

于 2013-07-09T14:53:53.837 に答える