Синтаксический анализ текста (VB.Net )

#vb.net #visual-studio-2010 #parsing

#vb.net #visual-studio-2010 #синтаксический анализ

Вопрос:

Я пытаюсь разобрать длинный текст, разделенный символом *. Этот текст должен быть показан как во втором примере. Каков самый простой способ синтаксического анализа этого образца текста, чтобы отсортировать текст для удобства чтения.

Пример текста

*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

Способ должен быть показан в текстовом поле

 *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:

Вы можете просто использовать string.Split('*') и использовать Array.Sort для сортировки результирующего массива.

В качестве альтернативы можно использовать TextFieldParser класс для синтаксического анализа файла, используя * в качестве разделителя.

Комментарии:

1. Не разделится ли эта версия на второй » » в «хорошей» строке? Результатом будет Ln1: * 21.01.2008 // Дэвид // Лос-Анджелес // менеджер Ln2: * Он находится в Ln3: * 21.01.2008 // Дэвид // Лос-Анджелес // Менеджер … и т.д. Комбинация разделения и / или регулярного выражения для поиска » «, за которым следует цифра (или формат строки даты), была бы лучше, не так ли?

Ответ №2:

Вот еще одна версия для вас. Извините за тот факт, что я специалист по c #, поэтому я надеюсь, что это выглядит приемлемо в VB:

 Dim re As New Regex("(*d /d /d (?://[ws] ){3}*[ws] )")
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 переменную в текстовое поле.

ДЕМОНСТРАЦИЯ: http://www.ideone.com/ICwID

Ответ №3:

Попробуйте это: Ссылка: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));    
        }
}