从字符串中获取特定部分

时间:2019-04-03 18:33:01

标签: c# regex

我正在尝试从字符串中获取特定部分。我必须得到以“ @”开头的部分,并且仅包含拉丁字母中的字母。

我想我必须创建一个正则表达式模式,但是我不知道怎么做。

string test = "PQ@Alderaa1:30000!A!->20000";
var planet = "Alderaa"; //what I want to get
string test2 = "@Cantonica:3000!D!->4000NM";
var planet2 = "Cantonica";

我还需要获取其他一些内容,但是我会尝试自己获取。 (以':'开头,是整数;可以是“ A”(攻击)或“ D”(破坏),并且必须用“!”(感叹号)包围;以“->”开头,并且应该是整数)

3 个答案:

答案 0 :(得分:4)

您可以使用捕获组获取单独的部分:

@([a-zA-Z]+)[^:]*:(\d+)!([AD])!->(\d+)

这将匹配:

  • @([a-zA-Z]+)匹配@并在组1中捕获1+次a-zA-Z
  • [^:]*:使用否定的character class匹配0+次而不是:,然后匹配:(如果后面的内容可能只是可选数字,您也可以匹配0 +倍数字[0-9]*
  • (\ d +)捕获第2组1个以上的数字
  • !([AD])!匹配!,在第3组和A或D中捕获,然后匹配!
  • ->(\d+)匹配->并捕获第4组1个以上的数字

Demo | C# Demo

答案 1 :(得分:2)

您可以使用此正则表达式,该正则表达式使用积极的眼神来确保匹配的文本前面带有@,并使用[a-zA-Z]+捕获一个或多个字母,并使用积极的眼神来确保它后面跟一些可选的文本,冒号,然后是一个或多个数字,后跟!,然后是AD,再是一个!

(?<=@)[a-zA-Z]+(?=[^:]*:\d+![AD]!)

Demo

C# code demo

string test = "PQ@Alderaa1:30000!A!->20000";
Match m1 = Regex.Match(test, @"(?<=@)[a-zA-Z]+(?=[^:]*:\d+![AD]!)");
Console.WriteLine(m1.Groups[0].Value);

test = "@Cantonica:3000!D!";
m1 = Regex.Match(test, @"(?<=@)[a-zA-Z]+(?=[^:]*:\d+![AD]!)");
Console.WriteLine(m1.Groups[0].Value);

打印

Alderaa
Cantonica

答案 2 :(得分:2)

您已经有了一个不错的答案,但是我想添加一个新的名称来显示命名的捕获组。

您可以为您的行星创建一个类,例如

class Planet
{
  public string Name;
  public int Value1; // name is not cleat from context
  public string Category; // as above: rename it
  public string Value2; // same problem
}

现在您可以将正则表达式与命名组一起使用

@(?<name>[a-z]+)[^:]*:(?<value1>\d+)!(?<category>[^!]+)!->(?<value2>[\da-z]+)

Demo

用法:

var input = new[]
{
    "PQ@Alderaa1:30000!A!->20000",
    "@Cantonica:3000!D!->4000NM",
};

var regex = new Regex("@(?<name>[a-z]+)[^:]*:(?<value1>\\d+)!(?<category>[^!]+)!->(?<value2>[\\da-z]+)",
    RegexOptions.IgnoreCase | RegexOptions.Compiled);

var planets = input
    .Select(p => regex.Match(p))
    .Select(m => new Planet
    {
        Name = m.Groups["name"].Value, // here and further we can access to part of input string by name
        Value1 = int.Parse(m.Groups["value1"].Value),
        Category = m.Groups["category"].Value,
        Value2 = m.Groups["value2"].Value
    })
    .ToList();