using System; using System.Text; using System.Text.RegularExpressions; namespace Top.Api.Util { public abstract class StringUtil { private const string pattern = @"^\d*$"; private static readonly Regex REG_CIDR = new Regex("^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})/(\\d{1,2})$"); public static bool IsNumeric(string obj) { if (obj == null) { return false; } char[] chars = obj.ToCharArray(); int length = chars.Length; if (length < 1) return false; int i = 0; if (length > 1 && chars[0] == '-') i = 1; for (; i < length; i++) { if (!Char.IsDigit(chars[i])) { return false; } } return true; } public static bool IsDigits(string value) { if (string.IsNullOrEmpty(value)) { return false; } return Regex.IsMatch(value, pattern); } public static string[] Split(string data, char separatorChar) { if (string.IsNullOrEmpty(data)) { return null; } return data.Split(new char[] { separatorChar }, StringSplitOptions.RemoveEmptyEntries); } public static string ToCamelStyle(string name) { if (string.IsNullOrEmpty(name)) { return name; } char[] chars = name.ToCharArray(); StringBuilder buf = new StringBuilder(chars.Length); for (int i = 0; i < chars.Length; i++) { if (i == 0) { buf.Append(char.ToLower(chars[i])); } else { buf.Append(chars[i]); } } return buf.ToString(); } public static string ToUnderlineStyle(string name) { if (string.IsNullOrEmpty(name)) { return name; } StringBuilder buf = new StringBuilder(); for (int i = 0; i < name.Length; i++) { char c = name[i]; if (char.IsUpper(c)) { if (i > 0) { buf.Append("_"); } buf.Append(char.ToLower(c)); } else { buf.Append(c); } } return buf.ToString(); } public static string EscapeXml(string value) { if (string.IsNullOrEmpty(value)) { return value; } StringBuilder buf = new StringBuilder(); char[] chars = value.ToCharArray(); for (int i = 0; i < chars.Length; i++) { char c = chars[i]; switch (c) { case '<': buf.Append("<"); break; case '>': buf.Append(">"); break; case '\'': buf.Append("'"); break; case '&': buf.Append("&"); break; case '"': buf.Append("""); break; default: if ((c == 0x9) || (c == 0xA) || (c == 0xD) || ((c >= 0x20) && (c <= 0xD7FF)) || ((c >= 0xE000) && (c <= 0xFFFD)) || ((c >= 0x10000) && (c <= 0x10FFFF))) { buf.Append(c); } break; } } return buf.ToString(); } public static string FormatDateTime(DateTime dateTime) { return dateTime.ToString(Constants.DATE_TIME_FORMAT); } public static bool IsIpInRange(string ipAddr, string cidrAddr) { Match match = REG_CIDR.Match(cidrAddr); if (!match.Success) { throw new TopException("Invalid CIDR address: " + cidrAddr); } int[] minIpParts = new int[4]; int[] maxIpParts = new int[4]; string[] ipParts = match.Groups[1].Value.Split(new string[1] { "." }, StringSplitOptions.None); int intMask = int.Parse(match.Groups[2].Value); for (int i = 0; i < ipParts.Length; i++) { int ipPart = int.Parse(ipParts[i]); if (intMask > 8) { minIpParts[i] = ipPart; maxIpParts[i] = ipPart; intMask -= 8; } else if (intMask > 0) { minIpParts[i] = ipPart >> intMask; maxIpParts[i] = ipPart | (0xFF >> intMask); intMask = 0; } else { minIpParts[i] = 1; maxIpParts[i] = 0xFF - 1; } } string[] realIpParts = ipAddr.Split(new string[1] { "." }, StringSplitOptions.None); for (int i = 0; i < realIpParts.Length; i++) { int realIp = int.Parse(realIpParts[i]); if (realIp < minIpParts[i] || realIp > maxIpParts[i]) { return false; } } return true; } } }