Читать слово в C# - PullRequest
       20

Читать слово в C#

0 голосов
/ 21 апреля 2020

У меня вход как

string afterIN = "Text Field= Assignee AND Ticket Status != Deleted";

И я пытаюсь обработать это с моим кодом ниже:

char[] delimiterChars = { ' ', ',', '.', ':', '\t' };

string text = afterIN;

string[] words = text.Split(delimiterChars);
string str = "";

foreach (var word in words)
{
    if (word != "")
    {
        string strDelimit = "\"";

        str += strDelimit + word + strDelimit + ",";
    }
}

Я хочу output as

"Text Field",
"=",
"Assignee",
"AND",
"Ticket Status",
"!=",
"Deleted"

Другой тип input - это SQL запрос, например

SELECT # Tickets WHERE Ticket Status=Open OR Ticket Status=Pending

Desired output делится WHERE:

"Ticket Status",
"=",
"Open",
"OR",
"Ticket Status",
"=",
"Pending"

1 Ответ

1 голос
/ 21 апреля 2020

В общий случай вы хотите парсер ; однако, если есть гарантия, что исходная строка не имеет комментариев , строк и других сложных синтаксических конструкций, например,

  // here we should split on first 2 "AND"s
  Text Filed = /* And is commented*/ "A \"AND B" /* String */ AND Ticket Status != Deleted

Вы можете попробовать расщепить с помощью справка по регулярным выражениям :

  using System.Text.RegularExpressions;

  ...

  string source = "Text Field = Assignee AND Ticket Status != Deleted";

  // split on =, !=, and, or
  // Trim() each item if you want to get rid of leading / trailing spaces 
  string[] items = Regex.Split(
      source, 
    @"(!=|\band\b|=|\bor\b)", 
      RegexOptions.IgnoreCase);

Для обработки (очень) простых SQL (без комментариев, строк и c.) мы можем добавить некоторые Linq (до Skip начальная часть запроса и Take только where часть):

using System.Linq;
using System.Text.RegularExpressions;
... 
string source = 
  @"SELECT # Tickets 
     WHERE Ticket Status <> Open OR Ticket Status > Pending 
  GROUP BY x 
  ORDER BY y";

string[] delimiters = new string[] {
  "where",
  "order",
  "group",

  //TODO: put all delimiters here
  ">", "<", "<>", "=", "!=", ">=", "<=",
  "and", "or", "not"
};

string pattern = string.Join("|", delimiters
  .OrderByDescending(item => item.Length)
  .Select(item => item.All(c => char.IsLetter(c)) 
      ? $@"\b{item}\b" 
      : Regex.Escape(item))); 

string[] items = Regex
  .Split(source, $"({pattern})", RegexOptions.IgnoreCase)
  .Select(item => item.Trim())
  .SkipWhile(item => !"where".Equals(item, StringComparison.OrdinalIgnoreCase))
  .Skip(1) 
  .TakeWhile(item => !"order".Equals(item, StringComparison.OrdinalIgnoreCase) &&
                     !"group".Equals(item, StringComparison.OrdinalIgnoreCase))
  .ToArray();
...