2016-10-22 64 views
0

我從文件中讀取,並需要找到由兩個相同的非ASCII值/控制分隔符封裝在一個字符串,在這種情況下,「RS」在相同的控制分隔符之間查找字符串?

Image in Notepad++

我怎麼會去這樣做?我需要某種形式的正則表達式嗎?

+1

掃描文件直到找到分隔符,然後讀取直到下一個分隔符,然後停止。 –

+0

此文件是否有多個這種字符串和分隔符? – Andrew

+0

奇怪的是,你調用記錄分隔符␞都是非ASCII和一個字段封裝(我認爲你把它當作引用)。它是ASCII碼,我認爲它被用作字段_separator._有幾件事需要澄清:1)文件是什麼編碼? 2)␞也是一個Unicode字符,所以你會看到它是你讀取文件內容的字符串。 3)你是否可以排除␞字符可能成爲字段數據的一部分的可能性?如果不是,用什麼策略來區分␞作爲分隔符和␞作爲數據? (Ref:[CSV](https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules)) –

回答

0

RS代表記錄分隔符,它值爲30(或十六進制的0x1E)。你可以使用這個正則表達式:

\x1E([\w\s]*?)\x1E 

匹配RS,然後匹配任何字母,數字或空格,然後再次RS。 ?是爲了使正則表達式匹配儘可能少的字符,以防以後有更多的RS字符。

如果您不想匹配數字,您可以使用[a-zA-Z\s]而不是[\w\s]

例子:

string fileContents = "Something \u001Eyour string\u001E more things \u001Eanother text\u001E end."; 
MatchCollection matches = Regex.Matches(fileContents, @"\x1E([\w\s]*?)\x1E"); 

if (matches.Count == 0) 
    return; // Not found, display an error message and exit. 

foreach (Match match in matches) 
{ 
    if (match.Groups.Count > 1) 
     Console.WriteLine(match.Groups[1].Value); 
} 

正如你所看到的,你得到的Match一個集合,每個match.Value將整個匹配的字符串,包括分隔符。 match.Groups將具有所有匹配的組,第一個是整個匹配字符串(默認情況下),然後是您的每個組(括號之間)。在這種情況下,你的正則表達式中只有一個,所以你只需要列表中的第二個。

+0

這似乎工作,除了記錄分隔符在行中出現四次。它只獲取最後一對,並跳過第一對分隔符。 –

+0

那麼,你只是指定你想找到** a **字符串,並不是很多。有關您的場景的更多細節,更好的解決方:) – Andrew

+0

我的歉意 - 後見之明我的問題並沒有像應該得到的那樣清楚 –

0

使用正則表達式,你可以做這樣的事情:

string pattern = string.Format("{0}(.*){1}",firstString,secondString); 
var matches = Regex.Matches(myString, pattern); 
foreach (Match match in matches) 
    { 
     foreach (Capture capture in match.Captures) 
     { 
     //Do stuff, with the current you should remove firstString and secondString from the capture.Value 
     } 
    } 

在使用Regex.match後發現與之前建立的模式相匹配的字符串。
記住要逃避所有正則表達式的特殊字符。

0

您可以使用Regex.Matches,我使用X在本例中隔板:

var fileContents = "Xsomething1X Xsomething2X Xsomething3X"; 

var results = Regex.Matches(fileContents, @"(X).*?(\1)"); 

的,你可以在results循環做你想要的任何匹配。

正則表達式中的\1表示「引用第一組」。我把已經所以這將是第1組X之間(),我將用\1說,比賽在這個地方應該是完全一樣的組1

0

你不需要正則表達式。

  1. 閱讀文件內容(File.ReadAllText)。

  2. 拆分分隔符(String.Split)。

  3. 如果您知道只有一個字符串出現,請使用第二個數組元素(result[1])。否則,請採取其他所有條目(result.Where((x, i) => i % 2 == 1))。

相關問題