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 spaces.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' 等等。 - NET Developer 昨天“

我拿了你的代码和输入,只打印了组,它工作得很好。空格在那里,
将其分配给您的 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 回答