使用RegEx在特定字符后拆分字符串

时间:2016-06-16 17:03:42

标签: c# regex

我一直在努力尝试将这个字符串拆分到我设法开始工作的几个不同的地方,除非名称中有正斜杠,它会抛弃所有组完全。

字符串:

123.45.678.90:00000/98765432109876541/[CLAN]PlayerName joined [windows/12345678901234567]

我基本上需要以下内容:

  • IP组:123.45.678.90:00000(不含以下/)
  • id group:98765432109876541
  • 名称组:[CLAN] PlayerName
  • id1 group:12345678901234567

文字"加入"也必须在那里。但是窗户没有。

这是我到目前为止所做的:

(?<ip>.*)\/(?<id>.*)\/(.*\/)?(?<name1>.*)( joined.*)\[(.*\/)?(?<id1>.*)\]

这就像魅力一样,除非玩家名称包含&#34; /&#34;。我该如何逃避呢?

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

你基本上需要使用非贪婪的选择器(*?)。试试这个:

(?<ip>.*?)\/(?<id>.*?)\/(?<name1>.*?)( joined )\[(.*?\/)?(?<id1>.*?)\]

答案 1 :(得分:1)

由于您使用C#Regex并且不仅Regex标记了您的问题,我将提出替代方案。我不确定它是否会更有效率。如果您只是使用String.Split()

,我发现阅读和调试最简单

Demo

public void Main()
{
    string input = "123.45.678.90:00000/98765432109876541/[CLAN]Player/Na/me joined [windows/12345678901234567]";

    // we want "123.45.678.90:00000/98765432109876541/[CLAN]Player/Na/me joined" and "12345678901234567]"
    // Also, you can remove " joined" by adding it before " [windows/"
    var content = input.Split(new string[]{" [windows/"}, StringSplitOptions.None);

    // we want ip + groupId + everything else
    var tab = content[0].Split('/');

    var ip = tab[0];
    var groupId = tab[1];
    var groupName = String.Join("/", tab.Skip(2)); // merge everything else. We use Linq to skip ip and groupId
    var groupId1 = RemoveLast(content[1]); // cut the trailing ']'

    Console.WriteLine(groupName);
}

private static string RemoveLast(string s)
{
    return s.Remove(s.Length - 1);
}

输出:

[CLAN]Player/Na/me joined

如果您正在使用ip,groupId等类,我想你会这样做,只需将一个接受字符串作为参数的构造函数放入其中。

答案 2 :(得分:1)

你不应该使用贪婪的量化器(*)和.等开放字符。它不会按预期工作,并会导致很多回溯。

效率略高,但不过分严格:

^(?<ip>[^\/\n]+)\/(?<id>[^\/]+)\/(?<name1>\S+)\D+(?<id1>\d+)]$

Regex demo