using System.Text.RegularExpressions;
using System.Collections.Generic;
public static void Main()
string multiPolygonsString = "MULTIPOLYGON(((1 1,5 1,5 5,1 8,1 1),(2 2,2 6,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))";
Console.WriteLine(ReverseMultiPolygonString(multiPolygonsString));
static private string ReverseMultiPolygonString(string multiPolygonsString)
string firstLevelRegex = @"(\(\(\((.*?)\)\)\))";
string secondLevelRegex = @"(\(\((.*?)\)\))";
string thirdLevelRegex = @"(\((.*?)\))";
List<List<string>> nestedList = new List<List<string>>();
Regex regex = new Regex(firstLevelRegex);
Match matchNestedOne = regex.Match(multiPolygonsString);
if (matchNestedOne.Success)
str = matchNestedOne.Value.Remove(matchNestedOne.Value.LastIndexOf(')'));
regex = new Regex(secondLevelRegex);
var matches = regex.Matches(str);
foreach (Match matchNestedTwo in matches)
str = matchNestedTwo.Value.Remove(matchNestedTwo.Value.LastIndexOf(')'));
regex = new Regex(thirdLevelRegex);
matches = regex.Matches(str);
List<string> polygons = new List<string>();
foreach (Match matchNestedThree in matches)
str = matchNestedThree.Value.Remove(matchNestedThree.Value.LastIndexOf(')'));
nestedList.Add(polygons);
return BuildMultiPolygonString(nestedList);
static private string BuildMultiPolygonString(List<List<string>> nestedList)
StringBuilder sb = new StringBuilder();
foreach (List<string> polygons in nestedList) {
foreach (string polygon in polygons) {
List<string> toReverse = GetCoordinatesListString(polygon);
string reversedCoordinates = WriteCoordinatesListString(toReverse);
sb.Append("(").Append(reversedCoordinates).Append("),");
sb.Remove(sb.ToString().LastIndexOf(','), 1);
sb.Remove(sb.ToString().LastIndexOf(','), 1);
sb.Insert(0,"MULTIPOLYGON(").Append(")");
static private string WriteCoordinatesListString(List<string> coordinateList)
StringBuilder sb = new StringBuilder();
foreach (string coordinatesString in coordinateList)
sb.Append(coordinatesString).Append(",");
string returnedCoordinate = sb.ToString();
if (returnedCoordinate.LastIndexOf(',') != -1)
returnedCoordinate = returnedCoordinate.Remove(returnedCoordinate.LastIndexOf(','));
return returnedCoordinate;
static private List<string> GetCoordinatesListString(string coordinateGroup)
List<string> coordinatesList = new List<string>();
if (coordinateGroup.IndexOf(',') != -1)
List<string> inputList = new List<string>(coordinateGroup.Split(','));
foreach (string coordinatesString in inputList)
coordinatesList.Add(coordinatesString.Trim());
coordinatesList.Add(coordinateGroup);