【问题标题】:How to check characters after a specific part of a string in C#?如何检查 C# 中字符串的特定部分之后的字符?
【发布时间】:2022-01-18 18:25:45
【问题描述】:

我正在尝试在字符串中查找特定值,然后检查该值之后的字符。

我得到了第一部分,可以找到我需要的值,但想在我找到的每个值之后检查字符串中它前面的十个字符中的任何一个是否是数字。

这是我目前得到的第一部分:

     public class Text_Value : MonoBehaviour
 {  
     [SerializeField]
     private TMP_Text Text;
 
     public List<string> Values = new List<string>();
 
     private int ChestCircumference;
 
     private int BodyHeight;
 
     private int HighHipCircumference;
 
     private int BellyCircumference;
 
     private int CharacterIndex = 0;
 
 
     // Start is called before the first frame update
     void Start()
     {
         StartCoroutine(GetValues());
     }
 
     // Update is called once per frame
     void Update()
     {
         
     }
 
 
     IEnumerator GetValues()
     {
         if (Text.text == "No Data")
         {
             yield return new WaitForSeconds(0.1f);
 
             Debug.Log("Text Value Finder: Wating For Text Data");
 
             StartCoroutine(GetValues());
         }
         else if (Text.text != "No Data")
         {
             foreach (string value in Values)
             {
                 if (Text.text.Contains(value))
                 {
                     Debug.Log("Value Found: " + value);
                 }
                 else if (!Text.text.Contains(value))
                 {
                     Debug.Log("Missing Value: " + value);
                 }
             }
         }
     }
 
 }

我想我需要在 foreach 循环中使用一个循环,它会遍历接下来的十个字符,但不知道该怎么做。

字符串的一个例子是:

"领围":39.102776,"颈围":42.982479"

【问题讨论】:

  • 你所有的else if 应该简单地是else .. 目前你重复地进行两次相同的昂贵检查.. 在第一次检查之后你已经知道条件是否满足......
  • 您可能更愿意使用Regex.Match,这样您就可以找到给定模式的所有匹配项并返回匹配组,例如找到的完全匹配项以及它之前的数值......会更容易如果您能告诉我们您在字符串中查找的确切匹配项,请回答这个问题,包括字符串的预期外观示例
  • 你能提供一个示例字符串吗,这会有所帮助
  • @Yot 你是什么意思? Regex.Match 正是为此:在您的字符串中查找特定模式 .. 只是它比搜索精确匹配更灵活,因为您可以定义一个对任何匹配都有效的抽象模式,如果它们都遵循某个特定的相似的模式
  • 听起来你更想使用 JSON?

标签: c# string unity3d


【解决方案1】:

如前所述,您可以使用Regex.Matches,例如

var matches = Regex.Matches(Text.text, "\"(.*?)\":(.*?)(?=,|$)");
foreach(var match in matches)
{
    var key = match.Groups[1];
    var valueString = match.Groups[2];
    if(float.TryParse(valueString, out var value))
    {
        Debug.Log($"Found match for {key} with value = {value}");
    }
}

Regex Example and explanation


但是,如果这实际上是 JSON,那么您应该使用适当的 c# 表示并实际解析 JSON,例如取决于您的 JSON 的复杂性,只需使用内置的 JsonUtility

假设您可以访问 JSON 生成,并且可以使用不带空格的名称,例如

{
    "ChestCircumference":12.34,
    "BodyHeight":1.23,
    "HighHipCircumference":0.23,
    "BellyCircumference":0.34567,
    "CharacterIndex": 3
}

在你的情况下,你可以例如像

这样包装你的价值观
// The class name doesn't matter in JSON
[Serializable]
public class Config
{
     public float ChestCircumference;
     public float BodyHeight;
     public float HighHipCircumference;
     public float BellyCircumference;
     public int CharacterIndex = 0;
}

然后简单地做

var config = JsonUtility.FromJson<Config>(jsonString);

或者,如果更改 JSON 不是一个选项,请使用 Newtonsoft JSON,例如

{
    "Chest Circumference":12.34,
    "Body Height":1.23,
    "High Hip Circumference":0.23,
    "Belly Circumference":0.34567,
    "Character Index": 3
}

然后

[Serializable]
public class Config
{
     [JsonProperty ("Chest Circumference")]
     public float ChestCircumference;
     [JsonProperty ("Body Height")]
     public float BodyHeight;
     [JsonProperty ("High Hip Circumference")]
     public float HighHipCircumference;
     [JsonProperty ("Belly Circumference")]
     public float BellyCircumference;
     [JsonProperty ("Character Index")]
     public int CharacterIndex = 0;
}

然后做

var config = JsonConvert.DeserializeObject<Config>(jsonString);

【讨论】:

    【解决方案2】:

    访问特定值的最简单方法是解析字符串并将其放入字典中,其中部分的名称用作键:

    string input =
        "\"Collar Circumference\":39.102776,\"Neck Base Circumference\":42.982479";
    
    var dict = input.Split(",\"")
        .Select(p => p.TrimStart('"').Split("\":"))
        .ToDictionary(x => x[0], x => Double.Parse(x[1]));
    

    这个测试...

    double collar = dict["Collar Circumference"];
    double neckBase = dict["Neck Base Circumference"];
    Console.WriteLine(collar);
    Console.WriteLine(neckBase);
    foreach (var entry in dict) {
        Console.WriteLine($"\"{entry.Key}\" = {entry.Value}");
    }
    

    ...打印:

    39.102776
    42.982479
    “领围” = 39.102776
    “颈围” = 42.982479

    这假定所有值都可以表示为double。如果不是这种情况,请将它们保留为字符串:

    ...
    .ToDictionary(x => x[0], x => x[1]);
    

    【讨论】:

      【解决方案3】:

      2个版本,都输出正确的结果:

      使用 .NET 5 System.Text.Json

      这可行:

      using System;
                          
      public class Program
      {
          public static void Main()
          {
              var jsonString = @"{ ""Collar Circumference"":39.5678,""NeckBase Circumference"":42.876}";
              
              //parse it
              var yourObject = System.Text.Json.JsonDocument.Parse(jsonString);
              //retrieve the value
              var circumReference = yourObject.RootElement.GetProperty("Collar Circumference");
              
              Console.WriteLine(circumReference);
          }
      }
      

      使用 Newtonsoft 版本:

      安装包:https://www.nuget.org/packages/Newtonsoft.Json/13.0.1

      using System;
                          
      public class Program
      {
          public static void Main()
          {
              var jsonString = @"{ ""Collar Circumference"":39.5678,""NeckBase Circumference"":42.876}";
              dynamic obj = Newtonsoft.Json.Linq.JObject.Parse(jsonString);
              
              Console.WriteLine(obj["Collar Circumference"].ToString());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2022-06-14
        • 2019-02-12
        • 2019-10-20
        • 2013-10-21
        • 2011-07-08
        • 2020-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多