从c#中某个单词前后的字符串中过滤值

本文关键字:字符串 过滤 单词前 | 更新日期: 2023-09-27 18:07:17

我有很长的字符串,这是来自IMAP请求的响应,我想从中提取一些值。它通常被格式化为"x someword"或"someword x"-如何获得x(它可以是一个以上的数字)的someword(已知)?响应的每"行"看起来像:

* x someword 'r'n

和my string包含两行这样的代码。提取所需值的最简单方法是什么?

的例子:对于"* x word1'r'n* y word2'r'n",使用word2作为参数,我想得到y

完整响应示例:

* FLAGS (''Answered ''Flagged ''Draft ''Deleted ''Seen)'r'n* OK [PERMANENTFLAGS ()] Flags permitted.'r'n* OK [UIDVALIDITY xxx] UIDs valid.'r'n* 3 EXISTS'r'n* 0 RECENT'r'n* OK [UIDNEXT x] Predicted next UID.'r'n. OK [READ-ONLY] INBOX selected. (Success)'r'n

对于"EXISTS"我想要得到3.

从c#中某个单词前后的字符串中过滤值

我会使用正则表达式…你可以这样做:

string myString = "* FLAGS (''Answered ''Flagged ''Draft ''Deleted ''Seen)'r'n* OK [PERMANENTFLAGS ()] Flags permitted.'r'n* OK [UIDVALIDITY 657136382] UIDs valid.'r'n* 3 EXISTS'r'n* 0 RECENT'r'n* OK [UIDNEXT 4] Predicted next UID.'r'n. OK [READ-ONLY] INBOX selected. (Success)'r'n";
string myWordToFind = "EXISTS";
string result = Regex.Match(myString, @"(?<MyNumber>'d+)'s*(" + Regex.Escape(myWordToFind) + ")",
    RegexOptions.Compiled | RegexOptions.IgnoreCase)
    .Groups["MyNumber"].Value;

X markerWord'n'rmarkerWord Y

你想要{X, Y}吗?如果是这样,尝试先按行分割,然后简单地删除"markerWord"。

大致如下:

var result = input.Split(new[]{''n', ''r'}).Select(line => line.Replace("markerWord", string.Empty);
答:

更新那么我会用正则表达式。简单的概念证明,我相信你可以从这里开始:

static string GetParam(string input, string param) {
            var pattern = new Regex(@"[''*](?<value>.+)" + param);
            var split = input.Split(new[] { ''n', ''r' }, StringSplitOptions.RemoveEmptyEntries);
            var line = split.SingleOrDefault(l => pattern.IsMatch(l));
            if(line != null) {
                return pattern.Match(line).Groups["value"].Value.Trim();
            }
            return null;
        }

你应该使用正则表达式

Regex r=new Regex(@"(?<value>'d+)'s*(?<keyword>EXISTS|RECENT)");
foreach (var match in r.Matches(source).OfType(Match)) {
  var parameter=int.Parse(match.Groups["value"].Value);
  switch (match.Groups["keyword"].Value) {
    case "EXISTS":
      doExists(parameter);
      break;
    case "RECENT":
      doRecent(parameter);
      break;
  }
}

您可以使用以下代码(希望是不言自明的):

const string response =@"
    * FLAGS (''Answered ''Flagged ''Draft ''Deleted ''Seen)
    * OK [PERMANENTFLAGS ()] Flags permitted.
    * OK [UIDVALIDITY 657136382] UIDs valid.
    * 3 EXISTS
    * 0 RECENT
    * EXISTS 4      <------------------- another occurence of the word
    * OK [UIDNEXT 4] Predicted next UID.
    * OK [READ-ONLY] INBOX selected. (Success)";
    string word = "EXISTS";
    string pattern =
        Regex.Escape(word) +  // the word to find followed by...
        @"
        's+         (?# one ore more space characters followed by... )
        (?<num>'d+) (?# one or more digits. )
        |           (?# Or )
        (?<num>'d+) (?# one or more digits, then... )
        's+         (?# one ore more space characters followed by... )"
        + Regex.Escape(word); // the word to find.
    foreach (Match match in Regex.Matches(response, pattern, RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace))
    {
        Console.WriteLine(match.Groups["num"]);
    }
class Class1
{
     string str = "* FLAGS (''Answered ''Flagged ''Draft ''Deleted ''Seen)'r'n* OK [PERMANENTFLAGS ()] Flags permitted.'r'n* OK [UIDVALIDITY 657136382] UIDs valid.'r'n* 3 EXISTS'r'n* 0 RECENT'r'n* OK [UIDNEXT 4] Predicted next UID.'r'n. OK [READ-ONLY] INBOX selected. (Success)'r'n";
     public void FindString(string parm)
     {
         if (str.Contains(parm))
         {
             string[] parts = str.Split('*');
             foreach (var item in parts)
             {
                 if (item.Contains(parm))
                 {
                     string[] values = item.Split(' ');
                     string value = values[1];
                 }
             }
         }
     }
     static void Main(string[] args)
     {
         Class1 c = new Class1();
         c.FindString("EXISTS");
     }
}