#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));
}
}