Выберите все между кавычками, содержащими частичное ключевое слово - PullRequest
0 голосов
/ 30 января 2019

Я хочу получить полную строку между кавычками, которая соответствует частичному ключевому слову.

Предположим, у меня есть ключевое слово (т.е. example-a), которое является частью структуры каталога (то есть "/tutorial/example/example-a/").

Я пробовал "(.*?)", который возвращает все строки в кавычках из примера ввода.Мне не нравится идея повторения MatchCollection, чтобы найти, содержит ли оно ключевое слово target, так как мое текущее совпадение примерно 1700+.Я могу привести MatchCollection к списку для меня, чтобы затем опросить, если группа захвата содержит ключевое слово, и это работает в данный момент.

Так что я ожидаю, что для ввода "/tutorial/example/example-a/", Я могу передать любую строку для своего ключевого слова, в данном случае example-a и вернуть значение внутри кавычки /tutorial/example/example-a/.

Есть ли способ достичь этого в одном регулярном выражении?Или, возможно, лучший подход для достижения желаемых результатов?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Не так сложно написать свой собственный сплиттер, используя итератор.

Пожалуйста, дайте мне знать, если вам нужны изменения или есть вопросы.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        static IEnumerable<string> Split(string text, char splitChar, bool skipEmpty)
        {
            StringBuilder between = new StringBuilder();

            bool inside = false;

            foreach (char c in text)
            {
                if (c == splitChar)
                {
                    if (inside)
                    {
                        if (between.Length != 0 || !skipEmpty)
                            yield return between.ToString();

                        inside = false;
                    }
                    else
                    {
                        between.Clear();
                        inside = true;
                    }

                    continue;
                }

                between.Append(c);
            }
        }

        static void Main(string[] args)
        {
            string text = "\"/tutorial/example/example-a/\" aaa \"/tutorial/example/example-b/\" bbb \"/tutorial1/example1/example-a/\" ccc \"\" \"";

            string search = "example-A";

            Console.WriteLine("All results:");
            Console.WriteLine();
            foreach (string item in Split(text, '"', skipEmpty: true))
            {
                Console.WriteLine(item);
            }

            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine($"Search results of '{search}' case-insensitive:");
            Console.WriteLine();
            foreach (string item in Split(text, '"', skipEmpty: true).Where(i => i.IndexOf(search, StringComparison.OrdinalIgnoreCase) != -1))
            {
                Console.WriteLine(item);
            }

            Console.ReadKey();
        }
    }
}
0 голосов
/ 30 января 2019

Вы можете воспользоваться Regex "lookeahead", например, в паттерне

"([^"]*(?=example-a)[^"]*)"

мы сопоставляем двойную кавычку, за которой следует что угодно, кроме закрывающей двойной кавычки, но часть (?=example-a) (положительнаяутверждение lookeahad) сообщает, что следует продолжать сопоставление, только если example-a найдено до того, как " соответствует закрывающей кавычке.Это называется утверждением нулевой длины, потому что оно ничего не добавляет к сопоставляемым символам, но может контролировать, совпадать или нет.( и ) рядом с кавычками фиксирует часть внутри них.

https://regex101.com/r/bUd8lf/2/

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