Упрощение выражения Regex - PullRequest
0 голосов
/ 03 июля 2019

Я не очень знаком с Regex и пытаюсь свести перечисленные ниже проблемы к одному выражению. В первом примере всегда будет {Container:}, а во втором всегда будет {Container: randomname Running · random# GPM · randomitem}, где Running также может быть Offline и Stopped.

Задача 1:

Выражение, которое я хочу сузить: {Container: Jake}

Желаемый результат регулярного выражения: “Jake”

Текущее решение:

String test = {Container: Jake}
Regex.Replace(test.ToString(), "{Container:", "");
Regex.Replace(test,"}", "");

Задача 2

Выражение, которое я хочу сузить: {Container: Jake Running · 56 GPM · Beans}

Желаемый результат регулярного выражения: “Running”

String test = {Container: Jake Running · 56 GPM · Beans }
Regex.Replace(test.ToString(), "{Container:", ""); //Gets rid of specific expression
Regex.Replace(test,"}", ""); //Gets rid of only } curly bracket
Regex.Replace(app_values.all_devices_status, @"\b(?!Running|Stopped)\b\w*",""); //gets ride of everything except “Running  ·  ·”  Problem is this expression leaves in dots 
Regex.Replace(app_values.all_devices_status, "[^a-zA-Z]+", ""); //gets only the alphabet letters 

Ответы [ 2 ]

1 голос
/ 03 июля 2019

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

  1. Использование обходных путей для захвата всего между{Container: ... }

    (?<={Container:\s).*?(?=})
    
    (?<={Container:\s\w+\s)\w+(?=\s.*?})
    

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

Использование группы захвата для извлечения результата

{Container:\s(\S+)}

{Container:\s\w+\s(\S+)\s.*?}

Вы можете проверить его здесь , проверить объяснение и сгенерировать код C # на основешаблон (даже если он не поддерживает 2-й вариант выше) здесь .

0 голосов
/ 03 июля 2019

Это выражение,

{Container:\s*([^\s}]+).*

захватывает Jake ( demo 1 ), и

{Container:.*?\s*([^\s]+)\s*·.*

может, вероятно, вернуть Running.

Демонстрация 2

Пример

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"{Container:.*?\s*([^\s]+)\s*·.*";
        string substitution = @"$1";
        string input = @"{Container: randomname Running · random# GPM · randomitem}
{Container: Jake Running · 56 GPM · Beans}
{Container: Jake-Some-other-name Running · 56 GPM · Beans}
{Container: Jake-Some-other-name     Running     · 56 GPM · Beans}";
        RegexOptions options = RegexOptions.Multiline;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...