【问题标题】:Read Word in C#在 C# 中读取单词
【发布时间】:2020-08-03 20:52:07
【问题描述】:

我有 输入

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 + ",";
    }
}

我想要输出

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

另一种类型的输入是 SQL 查询,例如

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

所需的输出被拆分WHERE:

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

【问题讨论】:

  • 您需要先在一张纸上列出您的规则,然后才能对其进行编程。我们不知道,为什么你期望那个输出。为什么它会那样解析你的字符串?显然,这不仅仅是在某些角色上分裂。你可以为它写一个语法吗?
  • 如果将“”定义为分隔符,则不能有“文本字段”。你想要的似乎比你想象的要复杂。
  • 我正在创建要传递给工具的动态字符串。像这样 IF [Text Field - Unsorted]="Assignee" AND [Ticket Status - Unsorted]!="Deleted" THEN [Update ID] ENDIF

标签: c# asp.net c#-4.0 webforms


【解决方案1】:

一般情况你需要一个解析器;但是,如果可以保证源字符串 没有 cmetsstrings 和其他复杂的语法结构,例如

  // 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(没有 cmets、字符串等),我们可以添加一些 Linq(到 Skip 查询的初始部分和 @ 987654324@ 仅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();

【讨论】:

  • 它正在工作。但是如果 group by 和 order by 有输入会起作用吗?
  • @user1994518:一般情况你必须解析 sql;但是,您可以稍微改进代码以支持group byorder by。我已经编辑了答案
  • 文本字段= 受让人和工单状态 已删除。我可以在 = 或 或 != 之前读单词吗?
  • @user1994518:您必须提及所有分隔符 (&lt;&gt;) 才能获得所需的模式,我已将分隔符提取为数组以便于工作跨度>
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多