Piraisudan Ответов: 3

Как разделить строку, разделенную запятой внутри скобки, используя регулярное выражение


Моя Входная Строка :
"сообщение ("Привет") {сообщение= сообщение.привет;}АБВ('Текст1','Текст2', Текст3);asdgfd основной.послать(сообщение);"

Выход:

'Text1'
'Text2'
Текст3

Мне нужно сопоставить "xyz('Text1','Text2', Text3)" из приведенной выше строки и получить каждое слово, разделенное запятой (,) в скобках. Может ли кто-нибудь дать правильное регулярное выражение для этого?

Что я уже пробовал:

Я пробовал, но не могу правильно получить эти разделенные значения

Richard Deeming

Это звучит так, как будто вы пытаетесь разобрать какой-то код на абстрактное синтаксическое дерево[^]. Регулярные выражения не являются хорошим решением для этого.

3 Ответов

Рейтинг:
0

OriginalGriff

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

(?<=xyz\().+?(?=\))

Затем либо разделите строку на запятые, либо проанализируйте ее с помощью второго простого регулярного выражения:
([^,]+?)(?=,|$)
Который дает вам каждый элемент в отдельном матче.

Таким образом, более поздние изменения гораздо легче прорабатываются - сложные регулярные выражения трудно читать и еще труднее модифицировать!


Piraisudan

Привет... Спасибо за ваш ответ...

Небольшое обновление, мой текст должен быть таким...
"сообщение ("Привет") {сообщение= сообщение.привет;}АБВ('Текст1','Текст2', Надпись3());asdgfd основной.послать(сообщение);"

Ваше первое регулярное выражение совпадает только с "Text1", "Text2", Text3 (". Можете ли вы, пожалуйста, предоставить решение, соответствующее тому, что мне нужно.

Также я модифицировал вот так "(?<=cmdSubmit\().+?[^()](?=\))" но он дает исключение типа "regex_error(error_syntax)" в библиотеке c++ std

Рейтинг:
0

Maciej Los

Решение без регулярных выражений, не элегантное, но...

string s = "message(hello) {message= msg.hello;}xyz('Text1','Text2', Text3);asdgfd main.send(msg);";

var parts = s.Split(new string[]{"xyz(", ");"}, StringSplitOptions.RemoveEmptyEntries)
	.Where(x=>x.Contains(","))
	.SelectMany(x=>x.Split(new string[]{","}, StringSplitOptions.RemoveEmptyEntries))
	.ToList();


Рейтинг:
0

Patrice T

Цитата:
Мне нужно сопоставить "xyz('Text1','Text2', Text3)" из приведенной выше строки

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

Всего лишь несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
RegExr: Learn, Build, & Test RegEx[^]
Онлайн-тестер регулярных выражений и отладчик: PHP, PCRE, Python, Golang и JavaScript[^]
Этот пример показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]
Этот сайт также показывает регулярное выражение в красивом графике, но не может проверить, что соответствует регулярному выражению:
Regexper[^]