1

私はこの正規表現を持っています:

(?'box_id'\d{1,19})","box_name":"(?'box_name'[\w\d\.\s]{1,19})

ボックス名にスペースが含まれている場合を除いて、これはうまく機能します。たとえば、それを実行すると、スペースなしmy boxでが返されます。mybox

box_nameグループにスペースを含めるにはどうすればよいですか?

コード:

Regex reg = new Regex(@"""object_id"":""(?<object_id>\d{1,19})"",""file_name"":""(?<file_name>[\w.]+(?:\s[\w.]+)*)""");
MatchCollection matches = reg.Matches(result);
if ( matches == null) throw new Exception("There was an error while parsing data."); 
if ( matches.Count > 0 )
{
  FileArchive.FilesDataTable filesdataTable = new FileArchive.FilesDataTable();
  foreach ( Match match in matches )
  {
    FileArchive.FilesRow row = filesdataTable.NewFilesRow();
    row.ID = match.Groups["object_id"].Value;
    row.Name = match.Groups["file_name"].Value;
  }
}

入力:

{"objects":[{"object_id": "135248"、 "file_name": "some space here.jpg"、 "video_status": "0"、 "thumbnail_status": "1"}、{"object_id": " 135257 "、" file_name ":" jup 13.jpg "、" video_status ":" 0 "、" thumbnail_status ":" 1 "}、{" object_id ":" 135260 "、" file_name ":" my pic.jpg " 、"video_status": "0"、 "thumbnail_status": "1"}、{"object_id": "135262"、 "file_name": "EveningWav)es、Hon(olulu、Hawaii.jpg"、 "video_status": " 0 "、" thumbnail_status ":" 1 "}、{" object_id ":" 135280 "、" file_name ":" test with space.jpg "、" video_status ":"0"、 "thumbnail_status": "1"}]、 "status": "ok"}

4

2 に答える 2

1

あなたのデータは一貫して二重引用符で区切られているように見えますね。その事実は正規表現の基礎となるはずです:

(?<box_id>\d{1,19})","file_name":"(?<box_name>[^"]{1,19})  //1 to 19 non " chars.

スペースが欠落している限り、このトークン(?'box_name' [\ w\d。\s]{1,19})は、'my box'を含む文字列の'mybox'と一致しないため、問題はダウンストリームである必要があります。

タイプミスとスタイル:文字通りの「box_name」がありますが、トークンは「file_name」です。また、デフォルトの<>角かっこが読みやすいのに、なぜ世界で名前付きグループ区切り文字として一重引用符を使用するように切り替えるのでしょうか(引用符は正規表現に含まれているためです)。

于 2011-12-15T19:44:10.323 に答える
0

@ sweaver2112が言ったことに加えて、引用符を追加してフレーミングを拡張し、{1,19}の範囲を取り除く必要があると思います。

これらの正規表現はPerlで動作しますが、C#を起動してテストしたくありません。

"(?<box_id>\d+)","(?:${type})":"(?<box_name>[\w.]+(?:\s[\w.]+)*)"
または、
"\s*(?<box_id>\d+)\s*","\s*(?:${type})\s*":"\s*(?<box_name>[\w.]+(?:\s[\w.]+)*)\s*"
ここで$ type ='file_name';

ただし、現実的には、これも機能するはずです(タイプが置き換えられます)。その検証は緩和されています。
"(?<box_id>\d+)","file_name":"(?<box_name>[^"]*)"

編集

「わからない、私の正規表現はあなたに何を返しましたか?–昨日sln
それは正しい結果を返しました、私の質問の入力で私はfile_nameグループのために'somespacehere.jpg''jup13.jpg'などを取得しました。

私はあなたのコードと入力を取り、グループを印刷するだけで、完璧に機能します。スペースがあり
ます。ROWデータへの割り当てに問題があるはずです。

こちらをご覧くださいhttp://www.ideone.com/HsTMF

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string input = @"{""objects"":[{""object_id"":""135248"",""file_name"":""some space here.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135257"",""file_name"":""jup 13.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135260"",""file_name"":""my pic.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135262"",""file_name"":""EveningWav)es,Hon(olulu,Hawaii.jpg"",""video_status"":""0"",""thumbnail_status"":""1""},{""object_id"":""135280"",""file_name"":""test with spaces.jpg"",""video_status"":""0"",""thumbnail_status"":""1""}],""status"":""ok""}";
      Regex reg = new Regex(
                   @"""object_id"":""(?<object_id>\d{1,19})"",""file_name"":""(?<file_name>[\w.]+(?:\s[\w.]+)*)"""
      );
      foreach ( Match match in reg.Matches(input) )
         Console.WriteLine(
                 "Id = '{0}',  File name = '{1}'", 
                 match.Groups["object_id"].Value,
                 match.Groups["file_name"].Value  );
   }
}

出力:

Id = '135248',  File name = 'some space here.jpg'
Id = '135257',  File name = 'jup 13.jpg'
Id = '135260',  File name = 'my pic.jpg'
Id = '135280',  File name = 'test with spaces.jpg'
于 2011-12-15T20:50:36.583 に答える