2017-09-22 13 views
0

C#で単純な正規表現を作成して、文字列をトークンに分割しようとしています。私が実行している問題は、私が使用しているパターンが空の文字列をキャプチャして、私の期待している結果を投げ捨てるということです。正規表現を変更して空の文字列を取得しないようにするにはどうすればよいですか?C#正規表現空の文字列を取り込む

var input = "ID=123&User=JohnDoe"; 
var pattern = "(?:id=)|(?:&user=)"; 
var tokens = Regex.Split(input, pattern, RegexOptions.IgnoreCase); 

// Expected Results 
// tokens[0] == "123" 
// tokens[1] == "JohnDoe" 

// Actual Results 
// tokens[0] == "" 
// tokens[1] == "123" 
// tokens[2] == "JohnDoe" 
+1

参照[「クエリ文字列」フォーマットされたデータを解析する最も簡単な方法(https://stackoverflow.com/questions/11956948/easiest-way-to-parse-querystring-formatted-data)。 –

+0

リンクはOPには答えません - .NETコアには存在しないSystem.Net.Http静的メソッドを使用しています –

+1

@WiktorStribiżewは確実に良いアプローチを示しています。意味的に同じ入力 '' User = JohnDoe&ID = 123 ''であなたのクエリ文字列が失敗するでしょう。この車輪を改造しないのが最善です。 –

答えて

2

異なるアプローチを使用してに関するごOPへのコメントはメリットを持っているかもしれないが、彼らは正規表現の振る舞いに関するあなたの特定の質問には対応していません。

正規表現の動作を取得しているにもかかわらず、暗黙的なキャプチャグループ(ed:または最初のグループのキャプチャ動作を制限するだけでも十分です)と関係がありますが、それをRegExの理解階層のトップレベルにしました。

編集:

ワーキング正規表現与えられたテストケースのために:

(?>id=)|(?:&user=)

これのどれもが自分の好みにされていない場合、あなたは常に、トークンのリストに述語を留めることができます:

tokens.Where(x => !string.IsNullOrWhiteSpace(x))

0

私はあなたがRegex.Splitでこの問題を解決できるとは思わない正直である。これを行う一つの強引なやり方は、すべての""を削除することです:

var input = "ID=123&User=JohnDoe"; 
var pattern = "(?:id=)|(?:&user=)"; 
var tokens = Regex.Split(input, pattern, RegexOptions.IgnoreCase).Where(x => x != ""); 

私はあなたが実際にグループ内のトークンをキャプチャする正規表現を使うべきだと思います。

var input = "ID=123&User=JohnDoe"; 
var pattern = "id=(.+)&user=(.+)"; 
var match = Regex.Match(input, pattern, RegexOptions 
    .IgnoreCase); 
match.Groups[1] // 123 
関連する問題