2016-10-22 61 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))。

相关问题