Соответствие регулярному выражению не включает пробел - PullRequest
1 голос
/ 15 декабря 2011

У меня есть это регулярное выражение:

(?'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": "немного места здесь.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" , "имя_файла": "EveningWav) ES, Хон (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"}

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Мне кажется, что ваши данные последовательно разделяются двойными кавычками, нет? Этот факт должен быть основой регулярного выражения:

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

Что касается пропущенных пробелов, этот токен (? 'Box_name' [\ w \ d. \ S] {1,19}) не может соответствовать 'mybox' в строке, содержащей 'my box', поэтому проблема должен быть ниже по течению.

Опечатки и стиль: у вас есть литерал «box_name», но токены - «file_name». Кроме того, почему в мире вы бы предпочли использовать одинарные кавычки в качестве разделителя именованной группы, когда <> скобки, по умолчанию, БОЛЕЕ читаемые (поскольку кавычки в регулярном выражении!)

0 голосов
/ 16 декабря 2011

В дополнение к тому, что сказал @ 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>[^"]*)"

edit

"Не уверен, что мое регулярное выражение вернуло к вам? - sln вчера
Он вернулсяправильные результаты, во входных данных в моем вопросе я получил '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'
...