Получить конкретные части из строки - PullRequest
4 голосов
/ 03 апреля 2019

Я пытаюсь получить определенные части из строки.Я должен получить часть, которая начинается после '@' и содержит только буквы латинского алфавита.

Полагаю, мне нужно создать шаблон регулярных выражений, но я не знаю, как.

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 ]

4 голосов
/ 03 апреля 2019

Вы можете получить отдельные части, используя группы захвата:

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

Это будет соответствовать:

  • @([a-zA-Z]+) Совпадение @ и захват в группе 1 1+ разa-zA-Z
  • [^:]*: Совпадение 0+ раз, а не : с использованием отрицательного класса символов , затем сопоставление : (Если последующее может быть только необязательными цифрамиВы также можете сопоставить 0+ раз цифру [0-9]*)
  • (\ d +) Захват в группе 2 1+ цифр
  • !([AD])! Совпадение!, захват в группе 3 и A илиD, затем сопоставьте!
  • ->(\d+) Совпадение -> и захват в группе 4 1+ цифр

Демо | C # Демо

2 голосов
/ 03 апреля 2019

У вас уже есть хорошие ответы, но я хотел бы добавить новый, чтобы показать именованные группы захвата.

Вы можете создать класс для своих планет, например

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]+)

Демо

Использование:

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();
2 голосов
/ 03 апреля 2019

Вы можете использовать это регулярное выражение, которое использует положительный взгляд, чтобы гарантировать, что сопоставленному тексту предшествует @, и один или несколько алфавитов захвачены с использованием [a-zA-Z]+ и использует положительный взгляд вперед, чтобы гарантировать, что за ним следуют некоторые необязательный текст, двоеточие, затем одна или несколько цифр, за которыми следует !, затем либо A или D, затем снова !

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

Демо

C # код демо

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...