Использование регулярных выражений для разделения строки по различным символам на основе вхождения - PullRequest
1 голос
/ 29 октября 2019

В настоящее время я заменяю очень старый (и длинный) класс синтаксического анализа строк C#, который, я думаю, может быть сведен в один оператор регулярного выражения. Будучи новичком в Regex, у меня возникли некоторые проблемы с его правильной работой.

Описание возможных строк ввода:

В строке ввода может быть до трех слов, разделенных пробелами. Он может остановиться на этом, или может иметь =, за которым следуют другие слова (любое количество), разделенные запятой. Слова могут также содержаться в кавычках. Если слово находится в кавычках и имеет пробел, оно НЕ должно быть разделено пробелом.

Примеры элементов ввода и ожидаемых выходных данных в массиве строк:

Input1: this is test Выход 1: {"this", "is", "test"}

Вход 2: this is test=param1,param2,param3

Выход 2: {"this", "is", "test", "param1", "param2", "param3"}

Input3: use file "c:\test file.txt"=param1 , param2,param3

Output3: {"use", "file", "c:\test file.txt", "param1", "param2", "param3"}

Input4: log off

Выход 4: {"log", "off"}

И самый сложный:

Input5: use object "c:\test file.txt"="C:\Users\layer.shp" | ( object = 10 ),param2

Выход 5: {"use", "object", "c:\test file.txt", "C:\Users\layer.shp | ( object = 10 )", "param2"}

Итак, чтобы разбить это на части:

  • Мне нужно разделить пробелы до первых трех слов
  • Затем, если есть =, проигнорируйте = и разделите запятыми вместо.
  • Если есть кавычки вокруг одного из первых трех слов и содержит пробел, ВКЛЮЧИТЕ этот пробел(не разделяйте)

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

\w+|"[\w\s\:\\\.]*"+([^,]+)

Это похоже на spгорит строка на основе пробелов и запятых после =. Тем не менее, по некоторым причинам он включает =, если одно из первых трех слов заключено в кавычки. Кроме того, я не уверен, как разделить пробел только до первых трех слов в строке, а остальные через запятую, если есть =.

Похоже, что часть моего решенияиспользовать квантификаторы с {}, но я не могу правильно их настроить.

1 Ответ

2 голосов
/ 29 октября 2019

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

            string[] inputs = { 
                              "this is test",
                              "this is test=param1,param2,param3",
                              "use file \"c:\\test file.txt\"=param1 , param2,param3",
                              "log off",
                              "use object \"c:\\test file.txt\"=\"C:\\Users\\layer.shp\" | ( object = 10 ),param2"
                          };

            foreach (string input in inputs)
            {
                List<string> splitArray;
                if (!input.Contains("="))
                {
                    splitArray = input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
                }
                else
                {
                    int equalPosition = input.IndexOf("=");
                    splitArray = input.Substring(0, equalPosition).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
                    string end = input.Substring(equalPosition + 1);
                    splitArray.AddRange(end.Split(new char[] { ',' }).ToList());
                }
                string output = string.Join(",", splitArray.Select(x => x.Contains("\"") ? x : "\"" + x + "\""));
                Console.WriteLine(output);
            }
            Console.ReadLine();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...