using System.Collections.Generic;
using System.Text.RegularExpressions;
private static int DefaultMaxLength = 40;
public static void Main()
string address = "Esteem Agency , Pusat Rehabilitasi PERKESO Tun Abdul Razak, Hang Tuah Jaya, Alor Gajah, 75450, Melaka";
string[] result = SplitAddress_v2(address);
foreach (string line in result)
Console.WriteLine("{0} [{1}]", line, line.Length);
private static string[] SplitAddress_v2(string fullAddress)
fullAddress = Regex.Replace(fullAddress, @"[^\u0020-\u007E]", " ");
fullAddress = fullAddress.Replace("?", " ");
var addressPieces = fullAddress.Split(' ').Where(a => !string.IsNullOrEmpty(a)).ToArray();
var addressLines = new string[] { "", "", "", "" };
var specialChars = new char[] { '.', ',' };
var currentAddressLine = 0;
foreach (var address in addressPieces)
var currentLineAvailableLength = DefaultMaxLength - addressLines[currentAddressLine].Length;
if (currentLineAvailableLength == 0)
if (currentAddressLine >= addressLines.Length)
if (string.IsNullOrEmpty(addressLines[currentAddressLine]))
addressLines[currentAddressLine] = address;
var tempAddress = address;
if (!specialChars.Any(a => a == tempAddress[0]))
tempAddress = " " + tempAddress;
if (tempAddress.Length <= currentLineAvailableLength)
addressLines[currentAddressLine] += tempAddress;
var specialCharIndex = -1;
foreach (var specialChar in specialChars)
specialCharIndex = tempAddress.IndexOf(specialChar);
if (specialCharIndex >= 0)
if (specialCharIndex >= 0 && specialCharIndex <= currentLineAvailableLength)
var lengthBeforeSpecialChar = specialCharIndex;
var lengthAfterSpecialChar = tempAddress.Length - specialCharIndex - 1;
var specialChar = tempAddress[specialCharIndex];
if (lengthBeforeSpecialChar == 0)
addressLines[currentAddressLine] += specialChar;
if (lengthAfterSpecialChar > 0)
if (currentAddressLine >= addressLines.Length)
addressLines[currentAddressLine] =
tempAddress.Substring(specialCharIndex + 1, lengthAfterSpecialChar).Trim();
addressLines[currentAddressLine] += tempAddress.Substring(0, lengthBeforeSpecialChar);
currentLineAvailableLength = DefaultMaxLength - addressLines[currentAddressLine].Length;
var beginIndexForSubString = specialCharIndex;
var lengthForSubString = lengthAfterSpecialChar + 1;
if (currentLineAvailableLength > 0)
addressLines[currentAddressLine] += specialChar;
beginIndexForSubString++;
if (currentAddressLine >= addressLines.Length)
addressLines[currentAddressLine] =
tempAddress.Substring(beginIndexForSubString, lengthForSubString).Trim();
if (currentAddressLine >= addressLines.Length)
addressLines[currentAddressLine] = tempAddress.Trim();
public static string[] SplitAddress(string address, int maxLength = 40, int totalLine = 4)
address = Regex.Replace(address, @"[^\u0020-\u007E]", " ");
address = Regex.Replace(address, @"\s+", " ");
address = address.Replace("?", " ");
List<string> lines = new List<string>();
while (address.Length > 0 && lines.Count < totalLine)
if (address.Length <= maxLength)
int index = address.LastIndexOfAny(new char[] {',', ' '}, maxLength);
lines.Add(address.Substring(0, index));
address = address.Remove(0, index + 1);
address = address.Trim();
if(lines.Count < totalLine)
var emptyLineCount = totalLine - lines.Count;
for (var i = 0; i<emptyLineCount; i++)