繁体   English   中英

如何在 C# 脚本中解析和查找字符串?

[英]How do I parse and find a string in a C# script?

我一直在尝试解析和搜索大字符串中的特定单词,但似乎无法弄清楚。 我创建了一个脚本,将 Twitch 频道的聊天连接到一个整体。

消息的一个例子是:

"@badge-info=subscriber/4;badges=moderator/1,subscriber/3,bits/1;bits=1;color=;display-name=TwitchUser1234;emotes=;flags=;id=da6ec4c6-af61-4346 -abc-123456789;mod=1;room-id=12345678;subscriber=1;tmi-sent-ts=160987654321;turbo=0;user-id=123456789;user-type=mod :TwitchUser1232.3twitchUser .tv PRIVMSG #thechannelyouarewatching :PogChamp1 另一个测试位"

我尝试通过执行以下操作来解析和搜索字符串“位”消息:

 private void GameInputs(string ChatInputs)
 {
    string Search;
    Search = ChatInputs.Split(";", "=");
    if(string "bits" in Search)
    {
        print("I made it here.");
    }
}

我完全不知所措,不知道该怎么做。 任何帮助表示赞赏。

如果需要我的完整代码,它是:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.ComponentModel;
using System.Net.Sockets;
using System.IO;

public class TwitchChat : MonoBehaviour
{

    private TcpClient twitchClient;
    private StreamReader reader;
    private StreamWriter writer;

    public string username, password, channelName; // http://twitchapps.com/tmi

    // Start is called before the first frame update
    void Start()
    {
        Connect();
    }

    void Update()
    {
        if(!twitchClient.Connected)
        {
            Connect();
        }

        ReadChat();
    }

    private void Connect()
    {
        twitchClient = new TcpClient("irc.chat.twitch.tv", 6667);
        reader = new StreamReader(twitchClient.GetStream());
        writer = new StreamWriter(twitchClient.GetStream());

        writer.WriteLine("PASS " + password);
        writer.WriteLine("NICK " + username);
        writer.WriteLine("USER " + username + " 8 * :" + username);
        writer.WriteLine("JOIN #" + channelName);
        writer.WriteLine("CAP REQ :twitch.tv/tags");
        writer.Flush();
    }

    private void ReadChat()
    {
        if (twitchClient.Available > 0)
        {
            var message = reader.ReadLine();

            print(message);

            GameInputs(message);
        }
    }

    private void GameInputs(string ChatInputs)
    {
        string Search;
        Search = ChatInputs.Split(";", "=");
        if(string "bits" in Search)
        {
            print("I made it here.");
        }
    }
}

如果你想拉出“bits=xx”的值,可以这样做:

var b = value.Split(';').FirstOrDefault(s => s.StartsWith("bits="))?[5..];

如果“bits=”不存在, b将为空

如果您要从该字符串中解析出很多值,请考虑将其转换为字典:

var c = new []{'='};

var d = value.Split(';').ToDictionary(s => s.Split(c,2)[0], s => s.Split(c,2)[1]);

拆分两次有点低效,如果打扰你,你可以子串:

value.Split(';').ToDictionary(s => s[..s.IndexOf('=')], s => s[s.IndexOf('=')+1..]);

这给出了一个字符串字典,所以你可以这样做:

if(d.ContainsKey("bits")){
  var bits = int.Parse(d["bits"]);
  ...

String 有一个方法 Contains(string) 可以完成这项工作:

if (ChantInputs.Contains("bits")
{
     print("I made it here.");
}

你可以试试下面。

private void GameInputs(string ChatInputs)
{
string[] Search = ChatInputs.Split(new char[] { ';', '=' });
foreach(string s in Search)
 {
  if(s == "bits")
  {
    print("I made it here.");
  }
 }
}  

下面是工作代码。

using System;

namespace ConsoleApp3
{
class Program
{
    static void Main(string[] args)
    {
        string str = "one;two;test;three;test+test";

        string[] strs = str.Split(new char[] { ';', '+' });

        foreach(string s in strs)
        {
            if(s == "test")
            {
                Console.WriteLine(s);
            }
        }

        Console.ReadLine();
    }
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM