В настоящее время я заменяю очень старый (и длинный) класс синтаксического анализа строк 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горит строка на основе пробелов и запятых после =
. Тем не менее, по некоторым причинам он включает =
, если одно из первых трех слов заключено в кавычки. Кроме того, я не уверен, как разделить пробел только до первых трех слов в строке, а остальные через запятую, если есть =
.
Похоже, что часть моего решенияиспользовать квантификаторы с {}
, но я не могу правильно их настроить.