2011-12-15 57 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'