【问题标题】:Find specific text in RichTextBox and set it to a string c#在 RichTextBox 中查找特定文本并将其设置为字符串 c#
【发布时间】:2019-12-11 05:34:56
【问题描述】:

我不知道如何做到这一点。我正在将一些信息打印到一个多行、有单词和数字的富文本框中。我需要在 Richtextbox 中搜索特定数字,如果它们在那里,请将它们设置为稍后使用的字符串。假设该框包含User: Matt User's number: 9 我想要一个标记为UserNum 的字符串,这样我就可以拥有类似Messagebox.Show("The User's Number is " + UserNum); 的内容并将其显示为The User's Number is 9

最初我认为这会起作用......

if (richtextbox1.Text.Contains(" 9") == true)
{
    UserNum = "9";
    Messagebox.Show("The User's Number is " + UserNum);
}

我该怎么做呢?名称和编号将在同一行,并且名称的长度会有所不同,因此我不能只看盒子中的固定位置。数字本身的范围也可以从 1 到 30,因此我需要重复 if 命令 30 次或输入一个范围。

编辑:可能还有其他行也可能包含 1-30 范围之外的数字。

【问题讨论】:

  • 通过您的编辑:那么您是否试图捕捉范围内的所有数字,第一个数字?

标签: c#


【解决方案1】:

使用正则表达式,您可以:

string pattern = @"[0-9]+";
string input = @"Matt's number for today 
is 33 and OK.";
RegexOptions options = RegexOptions.Multiline;

Console.WriteLine("Matt's number is: {0}", Regex.Matches(input, pattern, options)[0].Value);

【讨论】:

  • 我更喜欢这个解决方案而不是我的解决方案!
  • 那么你如何在这个正则表达式逻辑上强制执行上限和下限?或者如果没有数值?当然是找朋友。
  • @TravisActon 对于 30 岁左右的人,您可以拥有 string pattern = @"(30|[1-9]|[1-2][0-9])";
  • 所以这仍然不能解决问题,因为您的正则表达式是按字符而不是完整字符串解析的。例如,如果 Matt 的号码是 12,那么您将输出他的号码是 1。如果他的号码是 62,那么您将输出他的号码是 6。
  • 一个简单的逆向逻辑就可以解决string pattern = @"(30|[1-2][0-9]|[1-9])";
【解决方案2】:

似乎正则表达式在这里可能有用。否则,如果您知道文本框中只有一个数字,则可以选择所有数字字符并从数组中初始化一个新字符串:

var digitArray = richtextbox1.Text.Where(Char.IsDigit).ToArray();
string userNum = new String(digitArray);
Messagebox.Show("The User's Number is " + userNum);

【讨论】:

  • 可能会有多个数字,但没有一个在 1-30 范围内。
  • 在这种情况下,如果其他数字总是其他行,我会在 newLine char 上拆分文本,遍历数组查找所有数字,并返回第一个 >= 1 和
【解决方案3】:

您可以使用 Linq 查询来查找如下数字:

var nums = Enumerable.Range(1,30).Select(x => x.ToString());
var num = richtextbox1.Text.Split(' ')
                      .Where(x => numStr.Contains(x))
                      .Single();
Console.WriteLine("The user number is " + num);

【讨论】:

    【解决方案4】:
    1. 使用 String.Split 将字符串解析成数组
    2. 迭代数组并使用 Int32.TrParse 方法来确定“单词”是否实际上是一个数字

          var input = "User: Matt  User's number: 10";
          int num = 0;
          foreach(var word in input.Split(' '))
          {
              if (Int32.TryParse(word, out num) && Enumerable.Range(1,30).Contains(num))
              {
                  Console.WriteLine("The user number is " + num);
                  break;
              }
          }
      

    或使用 linq:

            int testNum;
            var digits = input.Split(' ').Where(a => Int32.TryParse(a, out testNum) && Enumerable.Range(1, 30).Contains(testNum)).FirstOrDefault();
            Console.WriteLine("Linq The user number is " + (!string.IsNullOrEmpty(digits) ? digits : "Not Found"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      相关资源
      最近更新 更多