Невозможно разделить путь с помощью Regex - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь разделить путь Cypher, который выглядит следующим образом:

(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })-[:_USE_]->(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })-[:_HAVE_]->(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })-[:_ENTITLE_TO_]->(`RS 3000`: MONEY { name: 'RS 3000' })

Что после разбиения должно дать мне, где элементы в четных индексах являются узлами в скобках, а элементы в нечетных индексах - это отношения, объединяющие их в квадратных скобках:

(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })
[:_USE_]
(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })
[:_HAVE_]
(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })
[:_ENTITLE_TO_]
(`RS 3000`: MONEY { name: 'RS 3000' })

Моя попытка 1:

public static void Main()
{
        string input = @"(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })-[:_USE_]->(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })-[:_HAVE_]->(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })-[:_ENTITLE_TO]->(`RS 3000`: MONEY { name: 'RS 3000' })";
        string pattern = @"(\(.+\))-(\[.+\])->(\(.+\))";
        string [] split = input.Split(new[] { "-", "->" }, StringSplitOptions.RemoveEmptyEntries);

        foreach (string item in split)
            Console.WriteLine(item);
}

Что выводит меня (обратите внимание на > в начале некоторых записей):

(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })
[:_USE_]
>(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })
[:_HAVE_]
>(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })
[:_ENTITLE_TO]
>(`RS 3000`: MONEY { name: 'RS 3000' })

Моя попытка 2:

public static void Main()
{
        string input = @"(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })-[:_USE_]->(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })-[:_HAVE_]->(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })-[:_ENTITLE_TO]->(`RS 3000`: MONEY { name: 'RS 3000' })";
        string pattern = @"(\(.+\))-(\[.+\])->(\(.+\))";
        string[] regSplit = Regex.Split(input, pattern);

        foreach (string item in regSplit)
            Console.WriteLine(item);
}

Что выводит меня:

(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })-[:_USE_]->(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })-[:_HAVE_]->(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })
[:_ENTITLE_TO]
(`RS 3000`: MONEY { name: 'RS 3000' })

(Это мой текущий Regex)

Я долго чесаю голову за это, буду признателен, если кто-нибудь сможет помочь.

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Ваш шаблон разделения может быть:

(?<=\))-|(?<=\])->

, что переводится как:

  • (?<=\))- найти все - символов, которым предшествует )
  • | или
  • (?<=\])-> найти все -> последовательности, которым предшествует ]

и будет производиться:

(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })
[:_USE_]
(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })
[:_HAVE_]
(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })
[:_ENTITLE_TO_]
(`RS 3000`: MONEY { name: 'RS 3000' })
2 голосов
/ 10 июля 2019

Я думаю, вы слишком усложнили это.Попробуйте это:

 string input = @"(`GROUP1`: TRAVEL_PLAN { name: 'GROUP1' })-[:_USE_]->(`LODGING`: TRAVEL_ENTITLEMENT { name: 'LODGING' })-[:_HAVE_]->(`LODGING_R_1`: RULE { name: 'LODGING_R_1' })-[:_ENTITLE_TO]->(`RS 3000`: MONEY { name: 'RS 3000' })";
 string[] split = input.Split(new[] { '-', '>' }, StringSplitOptions.RemoveEmptyEntries);
 foreach (string item in split)
 {
     Console.WriteLine(item);
 }

 Console.ReadKey();

Обратите внимание на упрощенные символы разделения и на этом этапе не требуется регулярное выражение.

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