2011-12-15 61 views
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; 
    } 
} 

输入:

{ “对象”:[{ “的object_id”: “135248”, “FILE_NAME”:“一些空间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,汉(olulu,H awaii.jpg“,”video_status“:”0“,”thumbnail_status“:”1“},{”object_id“:”135280“,”file_name“:”test with spaces.jpg“,”video_status“:” ,“thumbnail_status”:“1”}],“status”:“ok”}

+0

你可以给我们的那种你正在试图解析字符串的例子吗? – 2011-12-15 19:19:11

+0

类似于:{“objects”:[{“object_id”:“135260”,“file_name”:“my pic.jpg”,“video_status”:“0”,“thumbnail_status”:“1”},{“object_id “:”135261“,”file_name“:”New Text Document.txt“,”video_status“:”0“,”thumbnail_status“:”0“}],”status“:”ok“} – 2011-12-15 19:21:33

+0

这里有两个文件名,我的pic.jpg和新文本Document.txt – 2011-12-15 19:23:35

回答

1

在我看来,您的数据始终是双引号分隔的,不是?这一事实应该是正则表达式的基础:

(?<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

除了@ 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*"
其中$类型= 'FILE_NAME';

虽然现实,这也应该工作(类型被替换)。其验证放松。
"(?<box_id>\d+)","file_name":"(?<box_name>[^"]*)"

编辑

“不知道,做什么我正则表达式对您的回报 - ?昨天
SLN它返回正确的结果,在我的问题,输入我得到‘somespacehere.jpg’' jup13.jpg'等等file_name组。 - 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'