using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Globalization; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; namespace HuaTong.General.Utility { /// <summary> /// 字符串工具类 /// </summary> public static class StringHelper { /// <summary> /// 获取客户端IP地址 /// </summary> /// <returns></returns> public static string GetClientIp() { if (HttpContext.Current == null) { return string.Empty; } //可以透过代理服务器 string userIP = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; //判断是否有代理服务器 if (string.IsNullOrEmpty(userIP)) { //没有代理服务器,如果有代理服务器获取的是代理服务器的IP userIP = HttpContext.Current.Request.UserHostAddress; } return userIP; } /// <summary> /// 获取字符串 不返回null值 /// </summary> public static string[] SplitArr(object value, char[] split = null, StringSplitOptions option = StringSplitOptions.RemoveEmptyEntries) { var strValue = ToString(value); if (split == null) split = new char[] { ',' }; return strValue.Split(split, option); } /// <summary> /// 获取字符串 不返回null值 /// </summary> public static string ToString(object value) { if (value == null || value == DBNull.Value) { return string.Empty; } return value.ToString(); } /// <summary> /// 过滤Sql查询关键词中的敏感词汇 /// </summary> public static string SqlFilter(string value) { if (string.IsNullOrEmpty(value)) { return ""; } Regex regsql = new Regex(@"0x([0-9a-fA-F]{4})+|(%[0-9a-fA-F]{2})+|--|@@|count|asc|mid|char|chr|sysobjects|sys.|select|insert|delete|update|drop|truncate|xp_cmdshell|netlocalgroup|administrator|net user|exec|master|declare|localgroup|remove|create|extended_properties|objects|columns|types|extended|comments|table|cast", RegexOptions.IgnoreCase); value = value.Replace("'", "''").Trim(); //捕获的字符转换为"" return regsql.Replace(value, delegate (Match m) { return string.Empty; }); } /// <summary> /// 根据时间返回几个月前,几天前,几小时前,几分钟前,几秒前 /// </summary> /// <returns></returns> public static string DateBeforeNow(DateTime date) { TimeSpan span = DateTime.Now - date; if (span.TotalDays > 60) { return date.ToShortDateString(); } else if (span.TotalDays > 30) { return "1个月前"; } else if (span.TotalDays > 14) { return "2周前"; } else if (span.TotalDays > 7) { return "1周前"; } else if (span.TotalDays > 1) { return string.Format("{0}天前", (int)Math.Floor(span.TotalDays)); } else if (span.TotalHours > 1) { return string.Format("{0}小时前", (int)Math.Floor(span.TotalHours)); } else if (span.TotalMinutes > 1) { return string.Format("{0}分钟前", (int)Math.Floor(span.TotalMinutes)); } else if (span.TotalSeconds >= 1) { return string.Format("{0}秒前", (int)Math.Floor(span.TotalSeconds)); } else { return "1秒前"; } } /// <summary> /// 根据出生年月进行生日提醒 /// </summary> /// <returns></returns> public static string BirthdayMessage(DateTime date) { DateTime now = DateTime.Now; //TimeSpan span = DateTime.Now - birthday; int nowMonth = now.Month; int birtMonth = date.Month; if (nowMonth == 12 && birtMonth == 1) return string.Format("下月{0}号", date.Day); if (nowMonth == 1 && birtMonth == 12) return string.Format("上月{0}号", date.Day); int months = now.Month - date.Month; //int days = now.Day - birthday.Day; if (months == 1) return string.Format("上月{0}号", date.Day); else if (months == -1) return string.Format("下月{0}号", date.Day); else if (months == 0) { if (now.Day == date.Day) return "今天"; return string.Format("本月{0}号", date.Day); } else if (months > 1) return string.Format("已过{0}月", months); else return string.Format("{0}月{1}日", date.Month, date.Day); } /// <summary> /// 获取字符串的拆分结果 /// </summary> public static string[] Split(string value, string split) { return value.Split(split.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); } /// <summary> /// 获取字符串的拆分结果 /// </summary> public static string[] Split(string value, params string[] split) { return value.Split(split, StringSplitOptions.RemoveEmptyEntries); } /// <summary> /// 获取左边指定位数的字符串 /// </summary> public static string SplitLeft(string value, int length) { if (string.IsNullOrEmpty(value)) { return ""; } if (value.Length <= length) { return value; } return value.Substring(0, length); } /// <summary> /// 获取左边指定位数的字符串 /// </summary> public static string SplitRight(string value, int length) { if (string.IsNullOrEmpty(value)) { return ""; } if (value.Length <= length) { return value; } return value.Substring(value.Length - length); } /// <summary> /// 获取拆分符左边的字符串 /// </summary> public static string SplitLeft(string value, string split) { if (string.IsNullOrEmpty(value)) { return ""; } int index = value.IndexOf(split); if (index > 0) { return value.Substring(0, index); } else { return value; } } /// <summary> /// 获取拆分符右边的字符串 /// </summary> public static string SplitRight(string value, string split) { if (string.IsNullOrEmpty(value)) { return ""; } int index = value.IndexOf(split); if (index > 0) { return value.Substring(index + split.Length); } else { return value; } } /// <summary> /// 删除不可见字符 /// </summary> public static string RemoveEmpty(string value) { if (string.IsNullOrEmpty(value)) { return ""; } Regex reg = new Regex(@"[f v]*", RegexOptions.IgnoreCase); value = reg.Replace(value, ""); reg = new Regex(@"[ ]+");//合并多个空格为一个 return reg.Replace(value, " "); } /// <summary> /// 过滤文本中的空行 /// </summary> public static string RemoveEmptyRow(string value) { if (string.IsNullOrEmpty(value)) { return ""; } Regex reg = new Regex(@" [ |s| ]* ", RegexOptions.IgnoreCase); return reg.Replace(value, ""); } /// <summary> /// 获取字符串在数组中累计出现的次数 /// </summary> public static int GetStringCount(string[] stringArray, string findString) { string totalString = string.Join("", stringArray); return GetStringCount(totalString, findString); } /// <summary> /// 获取字符串在字符串累计出现的次数 /// </summary> public static int GetStringCount(string value, string findString) { if (string.IsNullOrEmpty(value)) { return 0; } int count = 0; int findStringLength = findString.Length; string subString = value; while (subString.IndexOf(findString) >= 0) { subString = subString.Substring(subString.IndexOf(findString) + findStringLength); count += 1; } return count; } /// <summary> /// 截取从startString开始到结尾的字符 /// </summary> public static string GetSubString(string value, string startString) { if (string.IsNullOrEmpty(value)) { return ""; } int index = value.IndexOf(startString); if (index == -1) return ""; index += startString.Length; if (index > 0) { return value.Substring(index); } else { return ""; } } /// <summary> /// 截取从startString开始到endString的字符 /// </summary> public static string GetSubString(string value, string startString, string endString) { value = GetSubString(value, startString); if (string.IsNullOrEmpty(value)) { return ""; } int length = value.IndexOf(endString); if (length > 0) { return value.Substring(0, length); } else { return ""; } } /// <summary> /// 按日期时间生成新文件名 /// </summary> public static string BuildFileNameByDate(string fileName) { if (string.IsNullOrEmpty(fileName)) { return ""; } return DateTime.Now.ToString("yyyyMMdd-") + DateTime.Now.Ticks + System.IO.Path.GetExtension(fileName); ; } /// <summary> /// 将字符串按指定长度截断 /// </summary> public static string CutString(string value, int len, string endWith) { if (string.IsNullOrEmpty(value)) { return ""; } if (len >= value.Length) { return value; } return value.Substring(0, len) + endWith; } /// <summary> /// 将字符串按指定长度截断 /// </summary> public static string CutString(string value, int len) { return CutString(value, len, ""); } /// <summary> /// 数制转换 /// </summary> public static string ConvertNumeric(string numeric, int fromBase, int toBase) { if (string.IsNullOrEmpty(numeric) || !StringValidate.IsNumeric(numeric)) { return "0"; } long newvalue = Convert.ToInt64(numeric, fromBase); return Convert.ToString(newvalue, toBase); } /// <summary> /// 浮点数字格式化 /// </summary> public static string FormatFloat(string numeric) { return FormatFloat(numeric, 2); } /// <summary> /// 浮点数字格式化 /// </summary> public static string FormatFloat(string numeric, int decLen) { return FormatFloat(numeric, decLen, false); } /// <summary> /// 浮点数字格式化,alwaysCarry为true时指定decLen之后有数即进位 /// 例:decLen=2 1.023结果为1.03 /// </summary> public static string FormatFloat(string numeric, int decLen, bool alwaysCarry) { if (string.IsNullOrEmpty(numeric) || !StringValidate.IsDecimalSign(numeric)) { return "0"; } double d = double.Parse(numeric); string temp = ""; if (alwaysCarry) { string zero = ""; for (int i = 0; i < decLen; i++) zero += "0"; temp = string.Format("{0:F" + decLen + "}", Math.Round(d + double.Parse(string.Format("0.{0}5", zero)), decLen, MidpointRounding.AwayFromZero)); } else { temp = string.Format("{0:F" + decLen + "}", d); } return temp; } /// <summary> /// 查找两个字符串最长的公共子串(LongestCommonSequence) /// </summary> public static string LCS(string value1, string value2) { if (string.IsNullOrEmpty(value1) || string.IsNullOrEmpty(value2)) { return ""; } int[,] d = new int[value1.Length, value2.Length]; int index = 0; int length = 0; for (int i = 0; i < value1.Length; i++) { for (int j = 0; j < value2.Length; j++) { // 左上角值 int n = i - 1 >= 0 && j - 1 >= 0 ? d[i - 1, j - 1] : 0; // 当前节点值 = "1 + 左上角值" : "0" d[i, j] = value1[i] == value2[j] ? 1 + n : 0; // 如果是最大值,则记录该值和行号 if (d[i, j] > length) { length = d[i, j]; index = i; } } } return value1.Substring(index - length + 1, length); } /// <summary> /// 两字符串相似度计算方法(编辑距离算法LevenshteinDistance又称EditDistance) /// </summary> public static string LD(string value1, string value2) { if (string.IsNullOrEmpty(value1) || string.IsNullOrEmpty(value2)) { return "0"; } int n = value1.Length; int m = value2.Length; int[,] d = new int[n + 1, m + 1]; int temp = 0; char ch1, ch2; int i = 0, j = 0; for (i = 0; i <= n; i++) { //初始化第一列 d[i, 0] = i; } for (j = 0; j <= m; j++) { //初始化第一行 d[0, j] = j; } for (i = 1; i <= n; i++) { ch1 = value1[i - 1]; for (j = 1; j <= m; j++) { ch2 = value2[j - 1]; if (ch1==ch2) { temp = 0; } else { temp = 1; } //对比获取最小值 int min = 0, first = d[i - 1, j] + 1, second = d[i, j - 1] + 1, third = d[i - 1, j - 1] + temp; min = first < second ? first : second; min = min < third ? min : third; d[i, j] = min; } } //输出百分比 保留两位小数 int maxLenth = value1.Length > value2.Length ? value1.Length : value2.Length; decimal percent = (1 - (decimal)d[n, m] / maxLenth) * 100; return string.Format("{0:F2}%", percent).Replace(".00", ""); } /// <summary> /// 中文繁体转中文简体 /// </summary> public static string TradToSimp(string value) { if (string.IsNullOrEmpty(value)) { return ""; } string temp = Microsoft.VisualBasic.Strings.StrConv(value, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0); return temp; } /// <summary> /// 中文简体转中文繁体 /// </summary> public static string SimpToTrad(string value) { if (string.IsNullOrEmpty(value)) { return ""; } string temp = Microsoft.VisualBasic.Strings.StrConv(value, Microsoft.VisualBasic.VbStrConv.SimplifiedChinese, 0); return temp; } /// <summary> /// 对指定串进行正则替换 /// </summary> /// <returns></returns> public static string Replace(string value, string pattern, string replace) { if (string.IsNullOrEmpty(value)) return ""; return Regex.Replace(value, pattern, replace, RegexOptions.IgnoreCase); } /// <summary> /// 对指定字符串计算其长度 /// </summary> /// <returns></returns> public static int Length(string value, bool isDistinguishFull) { int len = 0; if (string.IsNullOrEmpty(value)) return len; //除去两侧无效空格符 value = Replace(value, @"(^s*)|(s*$)", ""); if (isDistinguishFull == true) { ASCIIEncoding ascii = new ASCIIEncoding(); byte[] s = ascii.GetBytes(value); for (int i = 0; i < s.Length; i++) { if ((int)s[i] == 63) len += 2; else len += 1; } } else { len = value.Length; } return len; } /// <summary> /// 将指定字符串简单分拆为NameValueCollection /// </summary> /// <returns></returns> public static NameValueCollection TakeNameValueCollection(string value, Encoding encoding = null) { if (encoding == null) { encoding = Encoding.UTF8; } var coll = HttpUtility.ParseQueryString(value, encoding); return coll; } /// <summary> /// 对比字符串是否相等,默认忽略大小写 /// </summary> /// <returns></returns> public static bool IsEqualString(string value1, string value2, bool ignoreLower = true) { return string.Equals(value1, value2, ignoreLower ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal); } } }