2011-04-14 60 views
1

我想解析由*分隔的长文本。该文本必须像第二个例子那样显示。解析这个示例文本的最简单方法是将文本排序以便于阅读。解析文本(VB.Net)

文本样本

*01/21/2008//David//Los Angeles//Manager* He is in *01/21/2008//David//Los Angeles//Manager* He is Out for lunch *01/21/2008//David//Los Angeles//Manager* He came back from lunch *01/21/2008//David//Los Angeles//Manager* He is out for the day

的方式具有在TextBox

*01/21/2008//David//Los Angeles//Manager* He is in 
*01/21/2008//David//Los Angeles//Manager* He is Out for lunch 
*01/21/2008//David//Los Angeles//Manager* He came back from lunch 
*01/21/2008//David//Los Angeles//Manager* He is out for the day 

回答

1

这是你的另一个版本。对不起,其实我是一个C#的家伙,所以我希望这看起来在VB中可以接受的:

Dim re As New Regex("(\*\d+\/\d+\/\d+(?:\/\/[\w\s]+){3}\*[\w\s]+)") 
Dim original As String = "*01/21/2008//David//Los Angeles//Manager* He is in *01/21/2008//David//Los Angeles//Manager* He is Out for lunch *01/21/2008//David//Los Angeles//Manager* He came back from lunch *01/21/2008//David//Los Angeles//Manager* He is out for the day" 

Dim processed As String = re.Replace(original, "$1" + vbCrLf) 
Dim lines As String() = processed.Split(vbCrLf) 

For Each l As String In lines 
     Console.WriteLine(l) 
Next 

输出:

*01/21/2008//David//Los Angeles//Manager* He is in 

*01/21/2008//David//Los Angeles//Manager* He is Out for lunch 

*01/21/2008//David//Los Angeles//Manager* He came back from lunch 

*01/21/2008//David//Los Angeles//Manager* He is out for the day 

然后,你可以添加processed变量文本框。

DEMO:http://www.ideone.com/ICwID

3

可以简单地使用string.Split('*')并使用Array.Sort到所得的数组进行排序,以显示。

或者,使用TextFieldParser类来解析文件,使用*作为分隔符。

+0

不会在 “好” 弦上的第二个 “*” 这个版本分裂?输出将是Ln1:2008年1月21日//大卫//洛杉矶//经理Ln2:他在Ln3:2008年1月21日//大卫//洛杉矶//经理...等等。分裂和/或正则表达式组合寻找一个“*”后跟一个数字(或日期字符串的格式)会更好,不是吗? – wergeld 2011-04-14 19:55:07

0

试试这个:链接:http://ideone.com/bGLo8

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Test 
{ 
     public static void Main() 
     { 
      string str = "*01/21/2008//David//Los Angeles//Manager* He is in *01/21/2008//David//Los Angeles//Manager* He is Out for lunch *01/21/2008//David//Los Angeles//Manager* He came back from lunch *01/21/2008//David//Los Angeles//Manager* He is out for the day"; 
      int cnt = 1; 
      Action<char> PrintAction = delegate(char x) 
       { 
        if (x == '*') { cnt = (cnt + 1) % 2; if (cnt == 0) Console.WriteLine(); } 
        Console.Write(x); 
       }; 
      str.ToCharArray().ToList().ForEach(X => PrintAction(X));  
     } 
}