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つ追加すると、なぜこれが起こるのでしょうか?
ありがとうございました!