RegEx для захвата слова между = и; - PullRequest
1 голос
/ 27 мая 2019

Я хочу выбрать word2 из следующих:

word2;word3

word2, что находится между ; и началом строки, если между ними нет =.В этом случае я хочу начать с = вместо начала строки, как word2 с

word1=word2;word3

Я пытался использовать это регулярное выражение

(?<=\=|^).*?(?=;)

, которое выбираетword2 от

word2;word3

но также и целые word1=word2 от

word1=word2;word3

Ответы [ 3 ]

2 голосов
/ 27 мая 2019

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

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

(.+=)?(.+?);

или

(.+=)?(.+?)(?:;.+)

где вторая группа захвата имеет желаемое word2.

Демо 1

Демо 2

Пример 1

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(.+=)?(.+?);";
        string input = @"word1=word2;word3
word2;word3";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

Пример 2

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(.+=)?(.+?)(?:;.+)";
        string substitution = @"$2";
        string input = @"word1=word2;word3
word2;word3";
        RegexOptions options = RegexOptions.Multiline;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}
2 голосов
/ 27 мая 2019

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

^(?:\w+=)?(\w+);

Пояснение

  • ^ Начало строки
  • (?:\w+=)? Необязательная группа без захвата, соответствующая 1+ символам слова, за которыми следует =
  • (\w+) Захват в первой группе захвата 1+слово chars
  • ; Соответствие ;

См. regex demo

В .NET вы также можете использовать:

(?<=^(?:\w+=)?)\w+(?=;)

Regex demo | C # демо

enter image description here

0 голосов
/ 27 мая 2019

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

string[] words = str.Split(';');
string word2 = words[0].Substring(words[0].IndexOf('=') + 1);

Первая строка разделяет строку от ';'. Предполагая, что у вас есть только один «;» это утверждение разбивает вашу строку на две строки. И вторая строка возвращает подстроку первой части (words[0]), начиная с первого вхождения следующего символа '=' (words[0].IndexOf('=')) символа (+1) до конца. Если в вашей строке нет символов '=', она просто начинается с начала, потому что IndexOf возвращает -1.

Сопутствующая документация:

...