Regex - извлечение строковых шаблонов - PullRequest
0 голосов
/ 19 июня 2020

У меня много таких строк

/test/v1/3908643GASF/item
/test/v1/343569/item/AAAS45663/document
/test/v2/field/1230FRE/item
...

Для каждой мне нужно извлечь определенный шаблон, подобный этим

/test/v1/{Value}/item
/test/v1/{Value}/item/{Value}/document
/test/v2/field/{Value}/item

Значение может быть guid или чем-то еще, Может Я сопоставляю данные шаблоны строк с путями ввода с помощью регулярного выражения?

Я написал только этот код, но я не знаю, как сопоставить пути ввода с шаблонами. В результате должна получиться выкройка. Спасибо

string pattern1 = "/test/v1/{Value}/item";
string pattern2 = "/test/v1/{Value}/item/{Value}/document";
string pattern3 = "/test/v2/field/{Value}/item";

List<string> paths = new List<string>();
List<string> matched = new List<string>();    

paths.Add("/test/v1/3908643GASF/item");
paths.Add("/test/v1/343569/item/AAAS45663/document");
paths.Add("/test/v1/343569/item/AAAS45664/document");
paths.Add("/test/v1/123444/item/AAAS45688/document");
paths.Add("/test/v2/field/1230FRE/item");


foreach (var path in paths)
{


}

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

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

(\w+)\/\w+(?<=\/item)(\/(\w+)\/)?

Объяснение приведенного выше регулярного выражения:

(\w+) - представляет соответствие группы захвата словесный символ один или несколько раз. Эта группа фиксирует требуемый результат.

\/\w+(?<=\/item) - представляет собой положительный поиск назад, соответствующий символам перед \items.

$1 - Захваченная группа 1 содержит требуемую информацию, которую вы ожидаете.

(\/(\w+)\/)? - Представляет вторую и третью группу захвата, захватываемых, если после элемента присутствуют другие значения или нет.

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

Pictorial Representation

Sample implementation in C#:

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(\w+)\/\w+(?

You can find the sample run of the above implementation in здесь.

0 голосов
/ 19 июня 2020

Вы также можете получить значение с помощью Regex. Создайте метод расширения, который дает вам индекс n-го вхождения строки, а затем вы можете получить подстроку между индексом и следующим индексом /

public static class StringExtender
{
    public static int NthIndexOf(this string target, string value, int n)
    {
        Match m = Regex.Match(target, "((" + Regex.Escape(value) + ").*?){" + n + "}");

        if (m.Success)
            return m.Groups[2].Captures[n - 1].Index;
        else
            return -1;
    }
}

string str = "/test/v1/3908643GASF/item";

int start = str.NthIndexOf("/", 3);
int end = str.NthIndexOf("/", 4);
string temp = str.Substring(start + 1, end - start - 1);

Ссылка: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...