2017-05-08 11 views
1

私はRegexとC#で一致しようとしている文字列を持っています。C#Regexと一致しないRegex101

文字列はHello1004,"7"です。

私は(複数のスペース、1004[または,があるかもしれません。)

1004は常に1004ではないかもしれないが、それは常になります

var reg = new Regex(@"hello\s*\[?\s*,?\s*(?<group1>\d+)\s*,\s*""(?<group2>[^""]+)""", RegexOptions.IgnoreCase); 

で正規表現を作成しています4桁の数字。私が取得しようとしている何

は次のとおりです。

  • グループ1:1004
  • グループ2:7

あなたはRegex101デモhereを見ることができます。

それはデモで完璧に動作しますが、

foreach (var match in reg.Matches(text)) 
{ 
    var group1 = match.Groups["group1"]?.Value; 
    var group2 = match.Groups["group2"]?.Value; 
} 

group1が空でやったときとgroup2はそれで1004を持っています。 Hello1004の間にスペースを入れると、C#で正常に動作します。

なぜ私はこの2つの間にこの不一致があるのか​​説明できますか?

私は、Visual Studio 2017を使用している、.NET Frameworkの4

+2

http://ideone.com/FA8WNgを参照してください、それが働いているようです。 –

+0

同じです。 LinqPadでテストしました: var s = @ "Hello1004"、 "7" ""; \t \t var reg = new Regex(@ "hello \ s * \ [?\ s *、?\ s *(? \ d +)\ s *、\ s *" "(? [^" "] + ) "" "、RegexOptions.IgnoreCase); \t \t reg.Match(s)。ダンプ(); – Vidar

+0

@WiktorStribiżewHmmm ...それはうまくいくようです。しかし、私の実際のアプリケーションでは間違いなく機能しています。該当する場合は、私のバージョンの.NETで質問を更新します。 –

答えて

0

私は1つの問題は、foreachの機能では、C#はからのバリアントを作成するためにforeach(var match in reg.Matches(text))の戻り値の型を決定していないことだと思います。

私はC#VS2015
明示的なタイピングMatchそれがコンパイルし、それが想定さ
だ好きなのを実行するために変更した場合 Program.cs(48,24,48,30): error CS1061: 'object' does not contain a definition for 'Groups' and no extension method 'Groups' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

しかし、このエラーが発生します。

 var text = @"Hello1004,""7"""; 
     var reg = new Regex(@"hello\s*\[?\s*,?\s*(?<group1>\d+)\s*,\s*""(?<group2>[^""]+)""", RegexOptions.IgnoreCase); 
     foreach (Match match in reg.Matches(text)) 
     { 
      var group1 = match.Groups["group1"]?.Value; 
      var group2 = match.Groups["group2"]?.Value; 
      Console.WriteLine("{0} , {1}", group1, group2); 
     } 

出力

1004 , 7 
0

私はあなたの問題を推測しているあなたも特定されていることです。あなたがしたい最初のことは、4桁の数字と一致し、 "..."の内容と一致することです。だからあなたはただそれだけを言う必要があります。アンカーや検証として使用しない限り、必要のないものには一致させないでください。

(?<group1>\d{4})[^"]*"(?<group2>[^"]*) 
関連する問題